在下面的代码行中,类A是基类,由类B和类C继承。此外,D中的构造函数调用B、C和A的构造函数。因为当B和C将A作为虚函数继承时,它们没有资格直接调用A的构造函数(因为对A的调用必须通过第三代)。
我的问题是,如果我想创建一个类B的对象,那么由于A是虚拟继承的,那么有没有办法调用A的构造函数(传递用于初始化的变量v1和v2 )?
class A {
int a1,a2;
A() {
}
A(int v1,v2) {
a1 = v1;
a2 = v2;
}
};
class B:virtual public A {
int b1,b2;
B() {
}
B(int v1,v2) {
b1 = v1;
b2 = v2;
}
};
class C:virtual public A {
int c1,c2;
C() {
}
C(int v1,v2) {
c1 = v1;
c2 = v2;
}
};
class D:public B,public C {
int d1,d2;
D() {
}
D(int v1,v2):B(v1,v2),C(v1,v2),A(v1,v2)
{
d1 = v1;
d2 = v2;
}
};发布于 2012-04-11 17:28:53
也可以为B提供一个用于A的初始化器。所有的虚拟继承意味着,如果你有一个派生得更多的对象,那么这个虚拟库就是由派生最多的对象构造的()。但如果您只构造B的一个实例,那么该实例就是派生程度最高的对象。所以只要这样写就行了:
class B : public virtual A
{
public:
B() : A(1, 2) { }
// ...
};只有当您从B派生时,基本初始化器才会被忽略。
发布于 2012-04-11 17:30:18
你能做的就是让类B和C从A正常继承(没有关键字‘constructor>’),但是让类D从B和C继承。这将允许你通过传递类A的值来创建类B(或C)的对象
https://stackoverflow.com/questions/10103199
复制相似问题