2014-01-29 33 views
-1

我定义我的项目中包含以下接口:C++向下转换与虚基类

class iA 
class iB : virtual public iA 
class iC : virtual public iA 

当我现在实现接口..

class A : virtual public iA 
class B : virtual public iB, public A 
class C : virtual public iC, public A 

由于虚拟的,我不受钻石继承问题困扰。但现在,我想一个指针的iA向下转换成A型

void func1(iA* a){ 
    static_cast<A*>(a); 
} 

这是不可能的,因为虚拟继承iA。我可以在类A删除virtual关键字,但那么我会遭受钻石继承问题。 我知道我可以用dynamic_castiAA,但我真的不想这样做。

我必须用这种方式施放的情况如下: 接口iA定义了一个函数doSomething(iA* a)。我在类A中实现了这个功能。在函数内部,我需要A(它们不是iA的成员)的一些成员,所以我必须将iA* a投射到A*。由于我知道iA*A类型的对象,因为使用的实现中存在ABC(否则,函数doSomething()将永远不会在类A中调用),因此此演员表很安全。

这是一个糟糕的设计?我如何改进此设计以避免需要dynamic_cast

问候

+0

很难说如何在不知道细节的情况下改进设计。它可能需要重新设计。 –

+0

这对我来说确实看起来很糟糕。如果不知道你想要达到什么目的,那么无法说出一个好的设计。 –

回答

2

引入接口后,你不能假设一个类实现的iA是A(它可能是任何一些可能的[A0,A1,...的]。

离开你两个选择:

  • 降接口
  • 使用的dynamic_cast