【问题标题】:How to call child method from a parent pointer?如何从父指针调用子方法?
【发布时间】:2013-02-25 21:32:36
【问题描述】:

我有一个基类和一个扩展它的子类。子类有自己的方法,而父类没有。也就是说,在基类中将其声明为虚拟并不是一个真正的选择。

class A {
  public:
    virtual void helloWorld();
};

class B : public A {
  public:
    virtual void helloWorld();
    void myNewMethod();
};

然后,在我的实现中,我有一个指向 A 的指针,并将其构造为 B:

// somewhere in a .cpp file
A* x;
x = new B();
x->myNewMethod(); // doesn't work

我目前的解决方案是投射它:

((B *)x)->myNewMethod();

我的问题是,是否有更清洁的方式来做到这一点,或者正在寻找可行的方法?

【问题讨论】:

    标签: c++ inheritance polymorphism


    【解决方案1】:

    A 没有定义任何名为myNewMethod() 的方法,因此无法调用它。

    尽管我通常强烈反对投射,但这里确实投射是唯一的方法。

    【讨论】:

      【解决方案2】:

      我的问题是,是否有更清洁的方式来做到这一点,或者正在寻找可行的方法?

      在这种情况下,运行时强制转换似乎没问题。但是,您应该使用 dynamic_cast<> 而不是 C 风格的强制转换(如果您不确定 x 是否实际上指向 B 类型的对象):

      B* pB = dynamic_cast<B*>(x); // This will return nullptr if x does not point
                                   // to an object of type B
      if (pB != nullptr)
      {
          pB->myNewMethod();
      }
      

      另一方面,如果您确定x 指向B 类型的对象,那么您应该使用static_cast&lt;&gt;:

      B* pB = static_cast<B*>(x);
      pB->myNewMethod();
      

      【讨论】:

        【解决方案3】:

        好吧,您必须进行转换,但您可以通过将丑陋的转换语法隐藏在函数中来使代码看起来更清晰/更具可读性。

        B* B_static_cast(A* item)
        {
             return static_cast<B*>(item);
        }
        
        A* item = new B();
        B_static_cast(item)->funtion_in_B();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          • 2018-05-20
          • 1970-01-01
          • 2021-04-03
          • 2015-04-18
          • 2011-09-06
          相关资源
          最近更新 更多