Наследование конструкторов

Почему этот код:

class A { public: explicit A(int x) {} }; class B: public A { }; int main(void) { B *b = new B(5); delete b; } 

Результат этих ошибок:

 main.cpp: В функции 'int main ()':
 main.cpp: 13: ошибка: нет соответствующей функции для вызова на «B :: B (int)»
 main.cpp: 8: примечание: кандидаты: B :: B ()
 main.cpp: 8: примечание: B :: B (const B &)

Не следует ли B наследовать конструктор A?

(это использует gcc)

В C ++ 03 стандартные конструкторы не могут быть унаследованы, и вам необходимо наследовать их вручную один за другим, вызывая базовую реализацию самостоятельно. Если ваш компилятор поддерживает стандарт C ++ 11, существует наследование конструктора. Подробнее см. Статью Wikipedia C ++ 11 . С новым стандартом вы пишете:

 class A { public: explicit A(int x) {} }; class B: public A { using A::A; }; 

Конструкторы не наследуются. Они называются неявным или явным образом дочерним конструктором.

Компилятор создает конструктор по умолчанию (один без аргументов) и конструктор копии по умолчанию (один с аргументом, который является ссылкой на тот же тип). Но если вы хотите, чтобы конструктор принял int, вы должны определить его явно.

 class A { public: explicit A(int x) {} }; class B: public A { public: explicit B(int x) : A(x) { } }; 

UPDATE : в C ++ 11 конструкторы могут быть унаследованы. См. Ответ Сумы для подробностей.

Вы должны явно определить конструктор в B и явно вызвать конструктор для родителя.

 B(int x) : A(x) { } 

или

 B() : A(5) { } 

Это прямо на странице Бьярне Страуступа :

Если вы так решите, вы все равно можете стрелять в ногу, наследуя конструкторы в производном classе, в котором вы определяете новые переменные-члены, требующие инициализации:

 struct B1 { B1(int) { } }; struct D1 : B1 { using B1::B1; // implicitly declares D1(int) int x; }; void test() { D1 d(6); // Oops: dx is not initialized D1 e; // error: D1 has no default constructor } 

Правильный код

 class A { public: explicit A(int x) {} }; class B: public A { public: B(int a):A(a){ } }; main() { B *b = new B(5); delete b; } 

Ошибка b / c Класс B не имеет конструктора параметров, а во-вторых, он должен иметь инициализатор базового classа для вызова конструктора конструктора параметров базового classа

Как насчет использования функции шаблона для привязки всех конструкторов?

 template  Derived(T... t) : Base(t...) {} 
  • Преобразовать список в список
  • Каковы правила для вызова конструктора суперclassа?
  • Есть ли способ переопределить переменные classа в Java?
  • Почему мне приходится обращаться к членам базового classа шаблонов через этот указатель?
  • Поведение статических блоков с наследованием
  • Наследование с помощью конструктора базового classа с параметрами
  • Почему метод classа C #, реализованный в classе, должен быть общедоступным?
  • Цепочка метода + наследование плохо сочетается?
  • Java Inheritance - вызов метода суперclassа
  • C # - создание всех производных classов вызывает конструктор базового classа
  • Что случилось с переопределяемыми вызовами метода в конструкторах?
  • Interesting Posts

    Если функция не возвращает значение с допустимым типом возвращаемого значения, нормально ли компилятору выкинуть мусор?

    Любой способ «разгруппировать» элементы панели задач в Windows?

    Windows XP не показывает экран входа в систему после открытия крышки ноутбука

    Не удалось загрузить карту. Ошибка при обращении к серверам Google. Вероятно, это проблема аутентификации

    Что означает «L» перед строкой в ​​C ++?

    Как отсортировать список объектов по некоторому свойству

    целочисленная проверка ввода, как?

    Как определить, какой HD участвует в средстве просмотра событий?

    Как скрыть процесс в диспетчере задач на C #?

    Можем ли мы передать модель в качестве параметра в RedirectToAction?

    Для каждой строки в R-кадре данных

    Являются ли переменные Свифта атомарными?

    Content-Disposition: Каковы различия между «inline» и «attachment»?

    Изображение JPEG с неправильными цветами

    c – преобразовать строку в смешанном случае ко всему нижнему регистру

    Давайте будем гением компьютера.