【问题标题】:Pointer to base class指向基类的指针
【发布时间】:2011-05-03 05:56:36
【问题描述】:

如果我有以下课程:

class A
{
    ...
}

class B
{
    ...
}

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

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

【问题讨论】:

  • 发布您的代码。 C 已经是 A,所以不需要强制转换。
  • 很奇怪。可以复制粘贴真实代码吗?
  • 对不起,我搞混了,现在我发布真正的问题

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


【解决方案1】:

如果您确定您有一个指向C 对象的B*,您可以使用一对static_casts:

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

【讨论】:

    【解决方案2】:

    代码

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

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

    【讨论】:

      【解决方案3】:

      如果 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
      }
      

      【讨论】:

      • 哦!我只是加倍检查。是的,有不同的继承关系......我会更新问题
      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 2015-08-12
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多