我有这段代码:
class Base{
public:
int x;
Base(int x){
this->x = x;
}
virtual ~Base(){
cout<<"base destroyed"<<endl;
}
};
class A: public virtual Base{
public:
A(int x) : Base(x){ //is this base call here skipped?
}
virtual ~A(){
cout<<"a has been destroyed"<<endl;
}
};
class B: public A{
public:
B():Base(10),A(12){ //initialized from here, overwrite attempt
}
};
int main(int argc, char** argv) {
B ey;
cout<<ey.x<<endl;
return 0;
}
我尝试在具体类的构造函数初始化上覆盖它:
B():Base(10),A(12){
输出仍然打印10。
由于A类不是我的具体类,它是否跳过了base的构造函数?
A(int x):Base(x){
答案 0 :(得分:1)
虚拟基础仅由派生程度最高的类的构造函数构成,在本例中为B
。 (它们也恰好是在构造最派生类的任何非虚拟直接基础之前构造的。)
因为在你的情况下A
不是派生类最多的类,所以它的构造函数不构造虚拟基础。
答案 1 :(得分:0)
这种情况会发生,因为Base类构造函数只会被调用一次。它不会被多次调用。首先,为对象分配内存,然后调用Base的构造函数,然后调用A的构造函数,最后调用B的构造函数。基本上,在为对象分配内存之后,遍历从根类开始的继承树,并执行特定于每个派生部分的构造。层次结构中每个类的构造函数只调用一次。因此,只有当我们在A的构造函数中再次修改x的值时,才会在对象中更改x的值。