Mey*_*sam 1 c++ casting multiple-inheritance
我有以下几组课程:

以下代码:
A* a;
if(condition)
{
a = new E();
}
else
{
a = new D();
}
Run Code Online (Sandbox Code Playgroud)
现在假设有这样的功能F::foo(),为了调用它,我必须转换a为E*或者D*:
if(condition)
{
((E*)a)->foo();
}
else
{
((D*)a)->foo();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,铸造a到F*以打电话F::foo,因为是非法a的类型的A*; 对我来说,在打电话之前检查一下情况foo,听起来像是一个设计问题.有人可以就如何改进这个类层次结构提出一些建议吗?
ps使用此工具绘制图表.
#include <iostream>
struct A { virtual ~A() {} };
struct C : virtual A {};
struct B : virtual A {};
struct F {
virtual void Foo() { std::cout << "ok\n"; }
};
struct E : C, virtual F {};
struct D : B, virtual F {};
int main() {
A *a = new E();
dynamic_cast<F*>(a)->Foo();
}
Run Code Online (Sandbox Code Playgroud)
a不是实例F,那么dynamic_cast返回nulldynamic_cast到模糊基数将失败(返回null).在这个例子中没有模棱两可的基础,但你必须意识到它.如果反复发现自己处理那些都是实例的对象A和F那么应尽可能体现在类层次结构.例如,你可以定义一个类型G,从几乎都继承A和F.然后,D和E可以继承G,而不是F,你可以传递G*给这个代码,期望一个A*可在其上调用Foo().