从基类到不同派生类的多重继承转换

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(),为了调用它,我必须转换aE*或者D*:

if(condition)
{
    ((E*)a)->foo();
}
else
{
    ((D*)a)->foo();
}
Run Code Online (Sandbox Code Playgroud)

据我所知,铸造aF*以打电话F::foo,因为是非法a的类型的A*; 对我来说,在打电话之前检查一下情况foo,听起来像是一个设计问题.有人可以就如何改进这个类层次结构提出一些建议吗?

ps使用此工具绘制图表.

Ste*_*sop 5

#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)
  • 如果你搞砸了并且referand of a不是实例F,那么dynamic_cast返回null
  • 如果不使用虚拟继承,那么最终可能会出现模糊的基类.A dynamic_cast到模糊基数将失败(返回null).在这个例子中没有模棱两可的基础,但你必须意识到它.
  • 我在大多数课程中都遗漏了虚拟析构函数,但这只是因为我很懒.

如果反复发现自己处理那些都是实例的对象AF那么应尽可能体现在类层次结构.例如,你可以定义一个类型G,从几乎都继承AF.然后,DE可以继承G,而不是F,你可以传递G*给这个代码,期望一个A*可在其上调用Foo().