由继承的类C++重写的纯虚函数

Abh*_*tia -4 c++ inheritance visual-c++ c++11

可以通过具有常量纯虚函数的继承类覆盖纯虚函数(即末尾= 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 ();
}
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 5

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()
Run Code Online (Sandbox Code Playgroud)

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

void VirtualFunction () const override // "virtual" is optional when overriding
Run Code Online (Sandbox Code Playgroud)

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

error: ‘virtual void cInheritedClass::VirtualFunction() const’ marked override, but does not override
Run Code Online (Sandbox Code Playgroud)