有这段代码:
#include <iostream>
class Bazowa
{
int x;
public:
Bazowa() : x(55){}
Bazowa(int x_) : x(x_) {}
void fun()
{
std::cout << x << "fun\n";
}
};
class Pochodna1 : virtual public Bazowa
{
public:
Pochodna1() : Bazowa(101) {}
};
class Pochodna2 : virtual public Bazowa
{
public:
Pochodna2() : Bazowa(103) {}
};
class SuperPochodna : public Pochodna1, public Pochodna2
{
public:
SuperPochodna() : {}
};
int main() {
SuperPochodna sp;
sp.fun(); // prints 55fun
return 0;
}
执行此程序后,将打印“55fun”。在Pochodna1和Pochodna2类中构造函数调用发生了什么 - 它们被忽略了吗?为什么班级Bazowa的成员'x'被设置为'55',而不是'101'或'103'?
答案 0 :(得分:9)
始终从最终的叶类调用虚拟基础构造函数。不会调用虚拟基础的其他构造函数。在您的情况下,SuperPochodna()
正在调用Bazowa()
,并且未使用Bazowa(int)
和Pochodna1
中对Pochodna2
的调用。
请参阅http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14或google“虚拟基础构造函数”。