class A { };
class B : public A {};
class C : public A, public B {};
int main()
{
C c;
A *pA = static_cast<A *>(&c);
}
在上面的代码中,C类是在两个不同的路径中从A类派生的: 1.直接来自A. 2.间接通过B,即A&lt; -B <-C
因此,当我将类C的对象转换为指向类A的指针时,Linux上的g ++报告以下错误: 错误:A是C
的模糊基础我还通过删除静态强制转换尝试了相同的代码,如下所示: A * pA =&amp; c; 但是,我仍然得到完全相同的错误。
这有什么解决方案吗?顺便说一下,在使用Visual C ++编译器的Windows上,同样可以正常运行。
我知道虚拟继承可以解决这个问题,但是我需要一个解决方案来在Linux上使用g ++而不必使用虚拟继承。而不是必须使用虚拟继承,有什么方法我可以指定两个路径之一,摆脱歧义。非常感谢!
答案 0 :(得分:4)
如果你可以修改C
,一种可能的方法是在它和A
之间“注入”一个虚拟基类:
class A { };
class B : public A {};
class AlmostA : public A {};
class C : public AlmostA, public B {};
int main()
{
C c;
A *pA = static_cast<A*>(static_cast<AlmostA*>(&c));
}
您甚至可以将双重静态强制转换嵌入到C
中的函数中。
答案 1 :(得分:0)
长话短说,继承A
虚拟,以避免两个不同的A
成为C
的一部分:
class A { };
class B : virtual public A {};
class C : virtual public A, public B {};
现在您的代码将编译并正确运行。
与&#34;常规&#34;不同。基类,虚拟基类只能继承一次,无论拥有它们的路径数是多少。请阅读this Q&A以获取有关其工作原理的详细说明。