你能明确地使用祖先的虚拟类方法作为派生方法吗?

时间:2015-12-07 05:51:26

标签: c++ oop

是否可以在已被覆盖的情况下明确使用远程祖先的虚拟功能?类似于以下内容?


class A {
    virtual void task();
};

class B: public A {
    virtual void task() override;
};

class C: public B {
    virtual void task() = A::task; /* C++ doesn't like this */
};

我真的不想重新实施已经实施过的东西。它似乎在技术上是可行的,因为使用虚拟表来指向类方法,因此在幕后它应该能够将A的方法指针放在表中就好像它从未被覆盖过一样。

NOT 想要这样做:


class C: public B {
    virtual void task() {
        A::task();
    }
};

2 个答案:

答案 0 :(得分:4)

如果要在课程A中使用方法实现,您只需将其称为A::task()

这是非虚拟电话。

关于

  

c ++使用虚拟表指向类方法

......不,那不是这样,尽管这是常见的实施方式。

关于

  

想要这样做:

class C: public B {
  virtual void task() {
      A::task();
  }
}

...如果您希望课程task中的C充当A::task实施方式,那么就是这样做的。

答案 1 :(得分:3)

你说:

  

NOT 想要这样做:

class C: public B {
   virtual void task() {
      A::task();
   }
};

我认为鉴于目前的标准状态,这是最好的解决方案。