作者:外籍劳务输入 | 来源:互联网 | 2022-12-02 17:35
订单的-call.cpp
#include
class A
{
public:
A()
{
std::cout <<"A" ;
}
};
class B: public A
{
public:
B()
{
std::cout <<"B" ;
}
};
class C: virtual public A
{
public:
C()
{
std::cout <<"C" ;
}
};
class D: public B, public C
{
public:
D()
{
std::cout <<"D" ;
}
};
int main()
{
D d;
return 0;
}
编
g++ order-of-call.cpp -std=c++11
产量
AABCD
为什么这两个人A
在一起输出?我期待着类似的东西ABACD
.但是,如果我像这样更改继承顺序
class D: public C, public B
,输出就像预期的那样ACABD
.订单是标准的一部分还是g ++特有的.
1> bartop..:
这是有道理的,因为虚拟基类是在非虚基类之前构造的.所以你的情况是:virtual A
,non-virtual A
,BCD
.如果更改了继承顺序是virtual A
,C
,non-virtual A
,BD
.查看此:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/cplr389.htm
初始化类的顺序如下:
虚拟基类的构造函数按它们出现在基本列表中的顺序执行.
非声明基类的构造函数按声明顺序执行.
类成员的构造函数按声明顺序执行(无论它们在初始化列表中的顺序如何).
执行构造函数的主体.