【发布时间】:2013-03-06 08:57:25
【问题描述】:
我有以下一组类:
还有下面这段代码:
A* a;
if(condition)
{
a = new E();
}
else
{
a = new D();
}
既然有F::foo()这样的函数,为了调用它,我必须将a转换为E*或D*:
if(condition)
{
((E*)a)->foo();
}
else
{
((D*)a)->foo();
}
据我所知,将a 转换为F* 以调用F::foo 是非法的,因为a 是A* 类型;对我来说,在调用foo 之前检查条件听起来像是一个设计问题。有人可以就如何改进这个类层次结构提供一些建议吗?
附言用this tool画图。
【问题讨论】:
-
您需要通过虚函数实现动态多态性,然后实现将完成调用正确函数的所有艰苦工作。
-
出于兴趣,您为什么首先将您的
new E()分配给A*?下面的答案中讨论了几种不同的方法。其中一些会更改您现有的类层次结构,而另一些则不会。可能是这个关于A*的问题的答案导致了一个特定的解决方案。 -
@SteveJessop 我应该使用一个公共基类,它是
A或F来实例化E和D。建议F的答案可能来自A,反之亦然不符合我的设计要求,因为F和A的功能无关紧要。F不是接口,E和D都需要从它继承。我想我也可以选择F作为通用基类,但是我应该在需要时将a转换为A、C或B。到目前为止,您的答案似乎是最好的解决方案。 -
如果
F不是一个接口,那么为什么接收A*的代码期望它有一个名为Foo的函数呢?我提议的课程G给了它一个期望的理由,或者另一条路线是放弃多态性,接受它想要的是“D或E”,然后传递一个boost::variant<D*,E*>.这是最后的手段,但它可能是对您的设计的唯一正确描述。如果您的设计是必须将函数传递给D或E,那么仅仅因为A恰好是两者的共同基数就传递给它A*并不能反映设计。 -
@SteveJessop 使用
G类也是一个好主意。谢谢。
标签: c++ casting multiple-inheritance