据我所知,virtual确保基类的属性只有一个副本被继承到派生类。在多重继承中,首先调用所有基类的构造函数,然后调用派生类的构造函数。在下面的代码中,为什么类B的构造函数在一行中被调用两次?根据我的理解,输出应该是
B
B1
B2
D
但是输出结果却是
B
B
B1
B2
D
这是完整的代码。
#include <iostream>
class B
{
public:
B(){std::cout << "B" << std::endl;}
};
class B1:public B
{
public:
B1(){std::cout << "B1" << std::endl;}
};
class B2:virtual public B
{
public:
B2(){std::cout << "B2" << std::endl;}
};
class D:public B1, public B2
{
public:
D(){std::cout << "D" << std::endl;}
};
int main()
{
D d1;
}
B1对B的继承也必须是虚的。
虚拟继承并不意味着"在层次结构的其余部分中查找该类的继承实例",而是意味着"对这个层次结构中的所有虚拟继承只使用一个继承实例"。
这是一个经典的"菱形"问题。(这里描述)。你对virtual
关键字的理解是正确的,但它只适用于B1
和B2
。
这样写代码:
#include <iostream>
class B
{
public:
B(){std::cout << "B" << std::endl;}
};
class B1:public B
{
public:
B1(){std::cout << "B1" << std::endl;}
};
class B2:public B1
{
public:
B2(){std::cout << "B2" << std::endl;}
};
class D:public B2
{
public:
D(){std::cout << "D" << std::endl;}
};
int main()
{
D d1;
}