c++11 specifier: override or final

override specifier

override是C++11 引入的修饰符. 它最重要的2个作用:

  • 它告诉我们, 这个方法是虚函数, 我们正在重载基类的虚函数
  • 它让编译器去检查是否真的在重载虚函数, 而不是新增成员函数

例子

class B
{
public:
    virtual void what() = 0;
};

class D : public B
{
public:
    virtual void what() override
    {
        std::cout << "D::what()\n";
    }
};

final specifier

final也是c++11引入的修饰符. 它主要也有2个作用:

  • 阻止类被继承
  • 阻止基类的虚函数被子类重载

例子

class B final
{
public:
    virtual void what() = 0;
};

class D : public B  //error: cannot derive from 'final' base 'B' in derived type 'D'
{
public:
    virtual void what() override
    {
        std::cout << "D::what()\n";
    }
};

class C
{
public:
    virtual void what() final = 0;
};

class F : public C // 
{
public:
    virtual void what() // error: overriding final function 'virtual void C::what()'.  这里就算强制加上override, 一样会报同样的错误
    {
        std::cout << "F::what()\n";
    }
};

Interesting points

需要指出的是, final和override均不是关键字. 仅仅只是修饰符, 意味着以下代码合法:

int main()
{
    int override = 0;
    int final = 0;

    return 0;
}

为什么不是关键词, 突然加入一个关键字, 有可能打破后向兼容性等一系列问题. (在gcc5.7中测试, 加final, 98标准有警告这是c++11的特性, 如果继承的话, 也会报错)

final还能够让编译器优化代码. 如下:

class B
{
public:
    virtual void what() = 0;
};

class D : public B
{
public:
    virtual void what() final
    {
        std::cout << "D::what()\n";
    }

    void say_what()
    {
        what();
    }
};

D::say_what()这里调用了what()虚函数, 这里编译器有可能就会直接翻译成D::what(), 而不会再走多态规则.

final不能修饰非虚函数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值