visual被继承类C++重写的纯虚拟函数

visual Pure virtual function overridden by inherited class C++

本文关键字:虚拟 函数 重写 C++ 继承 visual      更新时间:2023-10-16

纯虚拟函数(即末端为=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。我希望常量函数只是一个编译器指令,以确保类中没有任何内容被写入,并且不会影响继承。我在一些冲突例程的级别类中使用了这一点,在这些例程中,最好指定函数是否可以在每个Object/class的基础上修改类。

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