如果我有以下课程:
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
在某处我检测到我已经指向类B
的类C
的指针,但是函数需要指向类A
的指针,我该怎么办?获取指向类A
的指针?
答案 0 :(得分:1)
如果C继承了A,那么C *指针应该可以隐式转换为A *指针。是否有可能没有包含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
}
答案 1 :(得分:1)
代码
class A
{
};
class B
{
};
class C : public A, public B
{
};
int main() {
C c;
A *a = &c;
}
有效,因为C已经是A,因此赋值有效。
答案 2 :(得分:1)
如果您确定某个B*
指向C
个对象,则可以使用一对static_cast
s:
B* bp = new C();
C* cp = static_cast<C*>(bp);
A* ap = static_cast<A*>(cp);
跨越继承层次结构的唯一方法是使用dynamic_cast
,这要求类型是多态的(即,您的类必须至少有一个虚拟成员函数; since your base class destructors should be virtual
, 这通常不是问题):
B* bp = new C();
A* ap = dynamic_cast<A*>(bp);
dynamic_cast
具有额外的好处,如果它失败(即,如果bp
实际上没有指向C
),则返回NULL。它的缺点是性能成本很低(static_cast
在运行时实际上是免费的。)