Наследовать от класса, у которого конструктор копирования удален
У меня есть класс base
, который содержит только частный конструктор по умолчанию и открытый конструктор удаленной копии, и ничего больше.
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
Если я попытаюсь наследовать от base
и создать экземпляр класса derived
, как показано ниже, g++ 4.8.2 не компилирует мой код, но VC++ 2013 делает это.
class derived : public base {
private:
derived() = default;
};
derived x;
Итак, это ошибка в g++ или VC++ 2013 просто проигнорировал что-то?
Вот полный код...
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
class derived : public base {
private:
derived() = default;
};
derived x;
int main() {
}
... и сообщение об ошибке g++.
main.cpp:12:5: error: 'constexpr derived::derived()' is private
derived() = default;
^
main.cpp:15:9: error: within this context
derived x;
^
main.cpp: In constructor 'constexpr derived::derived()':
main.cpp:3:5: error: 'constexpr base::base()' is private
base() = default;
^
main.cpp:12:5: error: within this context
derived() = default;
^
main.cpp: At global scope:
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here
derived x;
^
1 ответ:
Вы неправильно истолковываете ошибку, она говорит вам, что конструктор по умолчанию для
Почему вы хотите, чтобы эти конструкторы былиderived
недоступен (isprivate
), поэтому вы не можете использовать его для создания объекта этого типа. Теперь создание егоpublic
на уровнеderived
не поможет, так как конструкторbase
также являетсяprivate
и поэтому не может быть использован в конструктореderived
.private
?