C++11 final 和 override


阻止函数重写-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,非虚函数重载
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值