一个纯虚函数(即最后一个= 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。我希望常量函数只是一个编译器指令,以确保类中的任何内容都不会被写入并且不会影响继承。我在我的关卡类中使用它来处理一些碰撞例程,这样可以指定函数是否可以基于每个对象/类修改类。
答案 0 :(得分:5)
const
和volatile
限定符确实构成了函数签名的一部分,因此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