如果我有以下类别:

class A
{
    ...
}

class B
{
    ...
}

class C : public A, public B
{
    ...
}

和某个地方我检测,所指的类 B 我实际上分类 C, 但一个功能需要一个指类 A, 什么我可以做得到,针对类 A?

有帮助吗?

解决方案

如果你肯定知道你有一个 B* 这点 C 对象,可以使用的一对 static_casts:

B* bp = new C();
C* cp = static_cast<C*>(bp);
A* ap = static_cast<A*>(cp);

唯一的方法来投跨继承层次是使用 dynamic_cast, 要求类型是多态性(也就是说,你的类至少必须有一个虚拟件的功能; 因为你的基类析构应 virtual, 这通常不是一个问题):

B* bp = new C();
A* ap = dynamic_cast<A*>(bp);

dynamic_cast 有增加的效益,如果它未(就是说,如果 bp 实际上并没有指向一个 C),它返回空。它具有的缺点中的一种轻微的性能的成本(static_cast 是有效地免费在运行时)。

其他提示

代码

class A
{
};
class B
{
};
class C : public A, public B
{
};
int main() {
  C c;
  A *a = &c;
}

是有效的,因为C已经是一个,使该转让是有效的。

如果C继承一个如你所显示的那样,那么C*指针应该是隐含地转换为一个*指针。它是可能的,你有没有包含《宣言》的C类,以便编译器不知道这个继承关系?或者说实际上是一个不同的继承的关系比给你个问题吗?一些代码将有助于诊断这一问题。

编辑
根据更新版本的问题:

// Converts b to type A*, but only if it is actually
// of type C; otherwise, returns NULL
A* convertBtoAviaC(B* b) {
   C* c = dynamic_cast<C*>(b);
   return c; // note may be NULL, if b is not a C
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top