我试图解决一个钻石继承问题,类P从N继承,O继承类N,O继承从M继承。
M
/ \
N O
\ /
P报头
class M {
public:
M();
M(int aVal);
int a;
};
class N : virtual public M {
public:
N();
N(int aVal, int bVal);
void foo();
int b;
};
class O : virtual public M {
public:
O();
O(int aVal, int cVal);
void foo();
int c;
};
class P : public N, public O {
public:
P();
P(int aVal, int bVal, int cVal, int dVal);
void foo();
int d;
};我想要创建一个专门的构造函数来初始化这4个值,而不需要任何重复。
源代码
P::P(int aVal, int bVal, int cVal, int dVal)
: N(aVal, bVal), O(aVal, cVal), d(dVal)
{
// Only initialize with initializer list
}但是aVal是由N和O构造函数初始化的。有什么办法解决这个问题吗?如果需要更多代码,我将提供。
发布于 2022-01-17 19:02:55
但a由N和O构造函数初始化
这种假设是不正确的。如果虚拟继承像这样工作,它不会解决菱形问题(创建了1个构造函数调用=1个对象,如果N和O都调用了M的构造函数,那么就会有2个M对象,类似于没有虚拟继承)。
相反,virtual基类总是由大多数派生类初始化,在本例中是P。由于您没有在M构造函数中指定P的初始化,因此使用了默认构造函数。若要使用参数化构造函数,请在成员初始化程序列表中指定它:
P::P(int aVal, int bVal, int cVal, int dVal): M(aVal), N(aVal,bVal), O(aVal,cVal), d(dVal)
{
}请注意,aVal在N和O中可能未使用。您可能希望重构代码,以包含使用虚拟继承的事实,并删除这些参数(如果要直接使用N或O,则添加没有它们的单独构造函数)。
https://stackoverflow.com/questions/70745963
复制相似问题