0

如果我有以下课程:

class A
{
    ...
}

class B
{
    ...
}

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

在某处我检测到B我拥有的类的指针实际上指向一个类C,但是一个函数需要一个指向类的指针A,我该怎么做才能获得指向类的指针A

4

3 回答 3

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
}
于 2010-11-01T02:04:41.247 回答
1

编码

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

是有效的,因为 C 已经是 A,所以赋值是有效的。

于 2010-11-01T02:08:11.947 回答
1

如果你确定你有一个B* 指向一个C对象的 a,你可以使用一对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实际上并不指向 a C),它会返回 NULL。它的缺点是性能成本低(static_cast在运行时实际上是免费的)。

于 2010-11-01T02:14:32.757 回答