如果我有以下课程:
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
在某处我检测到B
我拥有的类的指针实际上指向一个类C
,但是一个函数需要一个指向类的指针A
,我该怎么做才能获得指向类的指针A
?
如果我有以下课程:
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
在某处我检测到B
我拥有的类的指针实际上指向一个类C
,但是一个函数需要一个指向类的指针A
,我该怎么做才能获得指向类的指针A
?
如果 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
}
编码
class A
{
};
class B
{
};
class C : public A, public B
{
};
int main() {
C c;
A *a = &c;
}
是有效的,因为 C 已经是 A,所以赋值是有效的。
如果你确定你有一个B*
指向一个C
对象的 a,你可以使用一对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
实际上并不指向 a C
),它会返回 NULL。它的缺点是性能成本低(static_cast
在运行时实际上是免费的)。