存在中间 class 而不执行参数化基础 class 构造函数
Existence of intermediate class without executing the parameterized base class constructor
我的代码:
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
我知道这里最派生的 class 调用 Parent class 默认构造函数,除非另有说明。
但是为什么 ChildX classes 的参数化 Parent 构造函数调用从未执行过?没有 ChildX classes,GrandChild class 就不可能存在(?)。如果没有参数化调用,ChildX classes 将不会被创建(?)。
I know that here the most derived class calls the Parent class default constructor unless specified otherwise.
远不止于此。最派生的 class always 独自负责初始化虚拟基 classes。没有例外!
如果最派生的 class 的构造函数没有为虚拟基 class 指定 mem-initializer,则虚拟基 class 是默认构造的。 "intermediate" classes 是否为虚拟基 class 指定了 mem-initializers 并不重要。那些根本被忽略了。它们 仅 在 class 是正在构建的最派生 class 时使用。
A mem-initializer where the mem-initializer-id denotes a virtual base class is ignored during execution of a constructor of any class that is not the most derived class.
(C++14 标准,[class.base.init]/7)
我的代码:
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
我知道这里最派生的 class 调用 Parent class 默认构造函数,除非另有说明。
但是为什么 ChildX classes 的参数化 Parent 构造函数调用从未执行过?没有 ChildX classes,GrandChild class 就不可能存在(?)。如果没有参数化调用,ChildX classes 将不会被创建(?)。
I know that here the most derived class calls the Parent class default constructor unless specified otherwise.
远不止于此。最派生的 class always 独自负责初始化虚拟基 classes。没有例外!
如果最派生的 class 的构造函数没有为虚拟基 class 指定 mem-initializer,则虚拟基 class 是默认构造的。 "intermediate" classes 是否为虚拟基 class 指定了 mem-initializers 并不重要。那些根本被忽略了。它们 仅 在 class 是正在构建的最派生 class 时使用。
A mem-initializer where the mem-initializer-id denotes a virtual base class is ignored during execution of a constructor of any class that is not the most derived class.
(C++14 标准,[class.base.init]/7)