C++ 虚拟多重继承构造函数
问题描述
我正在处理一个使用虚拟继承和多重继承的C++代码示例。在我的代码中,我注意到我必须在每个派生类中调用 Base
类的构造函数,即使传递给基类构造函数的值没有被使用。为什么这是必要的?我能否避免在每个派生类中调用基类构造函数,只在 Combined
类中调用它?
#include <stdio.h>
class Base
{
public:
Base(int n) : n(n) {}
int n;
};
class AddsSomething1 : virtual public Base
{
public:
AddsSomething1() : Base(1)
{
printf("AddsSomething1(): base %d\n", this->n);
}
int something1;
};
class AddsSomething2 : virtual public Base
{
public:
AddsSomething2(): Base(2)
{
printf("AddsSomething2(): base %d\n", this->n);
}
int something2;
};
class AddsSomething3 : virtual public Base
{
public:
AddsSomething3() : Base(3)
{
printf("AddsSomething3(): base %d\n", this->n);
}
int something3;
};
class Combined : public AddsSomething1, public AddsSomething2, public AddsSomething3
{
public:
Combined(int n) : Base(123)
{
printf("Combined(): base %d\n", this->n);
}
};
int main()
{
Combined(123);
}
输出:
AddsSomething1(): base 123
AddsSomething2(): base 123
AddsSomething3(): base 123
Combined(): base 123
解决方案
每个派生类型都必须调用虚基类的构造函数,因为只有最终派生类型的构造函数才会真正调用虚基类的构造函数。继承链中的其他基类会得知虚基类已经被构造并跳过这一步骤。