-
27-09-2019 - |
题
如果我有以下类别:
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
和某个地方我检测,所指的类 B
我实际上分类 C
, 但一个功能需要一个指类 A
, 什么我可以做得到,针对类 A
?
解决方案
如果你肯定知道你有一个 B*
这点 C
对象,可以使用的一对 static_cast
s:
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
}
不隶属于 StackOverflow