【问题标题】:Pure virtual function overridden by inherited class C++被继承类 C++ 覆盖的纯虚函数
【发布时间】:2014-10-23 09:12:28
【问题描述】:

纯虚函数(即末尾有 = 0 的函数)是否可以被具有常量纯虚函数的继承类覆盖并且仍然被调用?

#include <stdio.h>

struct cBaseClass {
    virtual void VirtualFunction () = 0;
};

struct cInheritedClass : cBaseClass {
    virtual void VirtualFunction () const {
        printf ("I'm a constant virtual function that"
                " overrided a pure virtual function!\n");
        }
    }
};

int main() {
    cBaseClass *Foo = new cInheritedClass;
    Foo->VirtualFunction ();
}

最后一行应该导致调用 cInheritedClass::VirtualFunction,而不是 cBaseClass::VirtualFunction。我希望常量函数只是一个编译器指令,以确保类中的任何内容也不会被写入并且不会影响继承。我在我的关卡类中将它用于一些碰撞例程,最好指定函数是否可以基于每个对象/类修改类。

【问题讨论】:

  • 你试过执行这段代码吗?
  • 如果没有被其他子类继承,则不需要virtual关键字
  • 你的覆盖函数不纯。
  • @LightnessRacesinOrbit 我并不是说编译器是终极的、标准实现的、无错误的真理。我只是说在互联网上发帖而不用你自己的编译器测试是没有意义的。

标签: c++ visual-c++ inheritance c++11


【解决方案1】:

constvolatile 限定符确实构成函数签名的一部分,因此const 函数不会覆盖非const 函数。由于这个原因,我的编译器拒绝了您的代码:

error: cannot allocate an object of abstract type ‘cInheritedClass’
note:  because the following virtual functions are pure within ‘cInheritedClass’:
note:  virtual void cBaseClass::VirtualFunction()

在 C++11 或更高版本中,您可以声明该函数应为覆盖:

void VirtualFunction () const override // "virtual" is optional when overriding

即使您不尝试实例化该类,也可以获得更好的诊断:

error: ‘virtual void cInheritedClass::VirtualFunction() const’ marked override, but does not override

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2014-05-22
    • 2018-10-09
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多