阻止函数重写-final
如下例,派生于 Object 的类 Base,重载了 Object 的接口 func()
,再将 Base::func()
声明为 final。
派生于 Base 的类 Dervied 对接口 func()
将会导致编译无法通过。
struct Object {
virtual void func() = 0;
};
/**
* final
* 在继承关系的 “中途” 终止之后的派生类的重载
*/
struct Base
: public Object {
void func() final;
};
struct Dervied
: public Base {
/**
* error: declaration of 'func' overrides a 'final' function
* 错误:无法重写 “final” 函数 "Base::func"
* “func” 的声明重写 “final” 函数
*/
// void func();
};
必须重载-override
如下例, Base 类中定义了纯虚函数A()
, B()
,虚函数 C()
,普通函数 D()
。在 Base 类的派生类 Dervied 中,打算重载这些函数,如果没有 override 修饰,所有函数都可能编译通过,这样可能不符合我们原本的意图。
加上 override 修饰符, 确保自己的接口重载的正确。
/**
* override
* 如果派生类的虚函数声明时使用了override描述符,该函数
* 必须重载其基类中的重名函数
*/
struct Base {
virtual void A() = 0;
virtual void B(int val) = 0;
virtual void C() const;
void D();
};
struct Dervied
: public Base {
/**
* override 检查该虚函数一定是重载基类
*/
virtual void A() override;
// virtual void B() override; // error,参数不对,不是重载
// virtual void C() override; // error,常量性不一致,不是重载
// virtual void D() override; // error,非虚函数重载
};