использование конструктора по умолчанию в наследовании конструктора - PullRequest
0 голосов
/ 04 марта 2019

У меня есть шаблонный класс "Derived", который выполняет наследование конструктора:

template <class T>
class Derived : public T
{
    using T::T;
    Derived()
    {
         std::cout<<"in derived"; 
    }
};

В моем базовом классе есть конструктор, который ожидает аргументы:

class Base
{
public:
    Base(int a)
    {
        std::cout<<"in base";
    }
};

Когда я создаю объекттипа Derived кажется, что производный конструктор не называется:

Derived<Base> derived(2);

печатает "в базе";

Почему?Есть ли способ сказать ему вызвать конструктор Derived?

1 Ответ

0 голосов
/ 04 марта 2019

Инициализация унаследованным конструктором происходит следующим образом:

[class.inhctor.init] (выделено)

1 Когда конструктор для типа B вызывается для инициализации объекта другого типа D (то есть, когда конструктор был унаследован), инициализация происходит так, как если бы для инициализации объекта D и каждого базового объекта использовался конструктор по умолчанию, используемый по умолчанию.подобъект класса, от которого унаследован конструктор, за исключением того, что подобъект B инициализируется вызовом унаследованного конструктора .Полная инициализация считается одним вызовом функции;в частности, инициализация параметров унаследованного конструктора выполняется до инициализации любой части объекта D.

Ключевой точкой является слово по умолчанию .Стандартные значения по умолчанию генерируются компилятором, например, копия по умолчанию может быть установлена ​​по умолчанию.И поэтому он не использует никакой c'or, определенный в производном классе.Сгенерированный компилятором c'tor всегда будет содержать пустой составной оператор.Поэтому не стоит ожидать, что что-нибудь будет напечатано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...