当我试图以惯常的方式“解决”通常的钻石问题——利用虚拟遗产:
A
/ * both virtual
B C
/
D
然而,我的基类A don t有违约构造者,因此,我是用人工方式从D调来。 然而,当我试图在这批钻石中添加一个E类,作为C产地
A
/ * both virtual
B C
/
D E
仍然需要用人工方式将A型建筑商称为E型建筑商,即: 即便没有多重继承,也没有钻石A-C-E,但从E产生什么东西。
class A
{public:
A (int _N): N(_N) {};
void show()
{cout<<"A"<<N;}
protected:
int N;
};
class B: public virtual A
{ public:
B(int n): A(2*n) {};
void show()
{ cout<<"B"<<N;}
};
class C: public virtual A
{ public:
C(int n): A(3*n) {};
void show()
{ cout<<"C"<<N;}
};
class D: public B,C
{ public:
D(): B(1), C(2), A(3) {};
void show()
{ cout<<"D"<<N;}
};
class E: public virtual C
{ public:
E(): C(1) {};
void show()
{ cout<<"E"<<N;}
};
int main()
{D d; // OK
A *a = &d;
a->show();
E e; // NOT OK, no function A::A() to call in E::E()
A *a2 = &e;
a2->show();
return 0;
}
如果不从E呼吁A建造者,能否解决这一问题? 我需要C做得适当......。
或者不可能试图完全解决钻石问题:
A A
| | no virtual at all
B C
/
D E
并且仍在试图宣布D类的标语,其中两例是A,但告诉汇编者在每次从D进行核对时使用A类C? 当我试图补充时
using C::A
在宣布D时,它仍然产生明确的基础A的错误。