Мой код:Наличие промежуточного класса без выполнения параметризированный конструктор базового класса
class Parent
{
public: Parent() { cout << "Default Parent" << endl; }
Parent(int x) { cout << "Parameterized Parent" << endl; }
};
class Child1: virtual public Parent
{
public: Child1() :Parent(10) { cout << "Default Child1" << endl; }
};
class Child2: virtual public Parent
{
public: Child2() :Parent(10) { cout << "Default Child1" << endl; }
};
class GrandChild: public Child1, public Child2
{
public:
GrandChild() { cout << "Default GrandChild" << endl; }
};
int main()
{
GrandChild G;
return 0;
}
Выход:
default Parent
default Child1
default Child2
default GrandChild
Я знаю, что здесь наиболее производный класс вызывает конструктор родительского класса по умолчанию, если не указано иное ,
Но почему аргументы конструктора родительского класса с параметрами ChildX никогда не выполнялись? Без классов ChildX класс GrandChild не может существовать (?). Без параметризованного вызова классы ChildX не будут созданы (?).
Почему не составители дают предупреждение о игнорируемых инициализации? – InQusitive
@InQusitive Это не заслуживает предупреждения; нет ничего явно неправильного с 'Child1' и' Child2', которые хотят инициализировать виртуальную базу одним способом, когда они являются наиболее производными классами, и 'GrandChild' хочет сделать это по-другому. – Brian
@Brian Существует один специальный случай: в абстрактном классе этот инициализатор никогда не будет выполнен. – curiousguy