C ++ 11标准提供了一种从基类继承构造函数的方法。我的问题是关于早期的标准。假设我以下列方式继承构造函数:
class Base {
public:
Base() {};
Base(int b) { a = ++b;}
virtual int foo() {return 0;}
int a;
};
class A : public virtual Base {
public:
A() {}
A(int b): Base(b) {}
int foo() {return a*a;}
};
class C : public A {
public:
C() {}
C(int b ): A(b) {}
int foo() { return (a*a + a);}
};
请注意,我正在使用Base类的虚拟继承。现在,当我尝试初始化指向C类型对象的指针时,代码不再调用Base(b)构造函数,代码最终调用Base()构造函数。这是我使用的主要功能:
int main(){
C *c = new C(5);
std::cout << c->Base::a << std::endl;
}
“a”的输出值为0.但是,当我继承Base类时删除virtual关键字,然后调用Base(b)构造函数并且“a”的值为6.有人可以帮助我了解发生了什么?为什么使用虚拟继承默认构造函数被调用?
答案 0 :(得分:6)
基于派生类的构造函数的成员初始化列表初始化虚拟基类。
在您的情况下,当您创建C
的实例时,将根据Base
的构造函数中的成员初始化列表初始化其C
子对象;由于Base
未列在那里,因此将默认初始化。
如果您要创建A
的实例,那么确实会使用A
的成员初始化列表。
所以要调用你想要的Base
构造函数,你必须像这样修改C
的构造函数:
C(int b ): A(b), Base(b) {}