C ++: как переменные-члены базового класса правильно инициализируются без определения параметризованного конструктора? - PullRequest
0 голосов
/ 15 декабря 2018

Сценарий 1: Нет проблем компиляции. Когда базовый класс инициализируется в производном классе с использованием списка инициализации

class Base
{
    public:
        int x;
};
class D:public Base
{
    public:
        int y;
        D(int y1):Base{y1+1},y{y1}{}
};

int main()
{
    D d(5);
    return 0;
}

Сценарий 2: Не компилируется и не запрашивается параметризованный конструктор.Обратите внимание на виртуальный деструктор в базовом классе $ g ++ -o main * .cpp main.cpp: в конструкторе 'D :: D (int)': main.cpp: 16: 34: ошибка: нет соответствующей функции для вызова 'Base ::Base () 'D (int y1): Base {y1 + 1}, y {y1} {} ^ main.cpp: 5: 7: примечание: кандидат: Base :: Base () класс Base ^ ~~~ main.cpp: 5: 7: примечание: кандидат ожидает 0 аргументов, 1 предоставлено main.cpp: 5: 7: примечание: кандидат: constexpr Base :: Base (const Base &) main.cpp: 5: 7: примечание: нет известного преобразования дляаргумент 1 от 'int' до 'const Base &'

class Base
{
    public:
    int x;
    virtual ~Base(){}    
};
class D:public Base
{
    public:
        int y;
        D(int y1):Base{y1+1},y{y1}{}
};

int main()
{
    D d(5);
    return 0;
}

1 Ответ

0 голосов
/ 15 декабря 2018

Base{y1+1} является совокупной инициализацией .Работает только на агрегатах.Во втором фрагменте, поскольку Base содержит виртуальную функцию, она больше не является агрегатом, и поэтому вы не можете ее инициализировать таким образом.

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