以多种方式向上转换为基类的C ++类(无需使用虚拟继承)

时间:2017-09-22 14:29:15

标签: c++ inheritance multiple-inheritance

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 ++而不必使用虚拟继承。而不是必须使用虚拟继承,有什么方法我可以指定两个路径之一,摆脱歧义。非常感谢!

2 个答案:

答案 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));
}

[Live example]

您甚至可以将双重静态强制转换嵌入到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以获取有关其工作原理的详细说明。