指向基类的指针

时间:2010-11-01 02:01:27

标签: c++ inheritance pointers multiple-inheritance base-class

如果我有以下课程:

class A
{
    ...
}

class B
{
    ...
}

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

在某处我检测到我已经指向类B的类C的指针,但是函数需要指向类A的指针,我该怎么办?获取指向类A的指针?

3 个答案:

答案 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在运行时实际上是免费的。)