自学内容网 自学内容网

C++_ C++11的override和final

1. override 关键字

用于明确表示派生类中的某个虚函数是用来重写基类中的虚函数的,这样编译器会检查基类,看看是否确实存在同样的虚函数,如果没有匹配,假设比对后发现参数类型、返回类型不同,会报错。

这样有效防止了因为函数签名(原型)不一致带来的意外行为。
以下例子中,print() 的参数类型不匹配,在VISUALSTUDIO2022 直接红色波浪线,在编译期即可检查出来

因此,明示函数是重写的而非新定义的,增加了代码的清晰度和可维护性。

class Base
{
public:
    virtual void show() const
    {
        cout << "Base::show" << endl;
    }
    virtual void print(int x)const
    {
        cout << "Base::print" << x << endl;
    }
};

class Derived :public Base
{
public:
    void show() const override // 正确重写
    {
        cout << "Derived::show" << endl;
    }
    void print(double x)const override // 错误重写,参数类型不匹配
    {
        cout << "Derived::print" << x << endl;
    }
};

2. final 关键字

final 可以用在虚函数和类上:

  • 在虚函数上使用 final,表示该函数在派生类中不能进一步被重写
  • 在类上使用 final , 表示该类不能被继承,防止进一步派生

如果在设计时,对于某些类或者虚函数不希望被进一步扩展或重写,可以用 final 强制该约束,避免不安全行为

在虚函数上使用 final

class Base 
{
public:
    virtual void show() const {
        cout << "Base::show" << endl;
    }
};

class Derived : public Base 
{
public:
    void show() const final  // 使用 final 禁止进一步重写
    { 
        cout << "Derived::show" << endl;
    }
};

class MoreDerived : public Derived 
{
public:
    void show() const override // 错误:不能重写 final 函数
    { 
        cout << "MoreDerived::show" << endl;
    }
};

Derived::show() 被标记为 final,MoreDerived 试图重写它,带来编译错误

在类上使用 final

class Base final   // 使用 final 表示该类不能被继承
{  
public:
    void display() const 
    {
        cout << "Base::display" << endl;
    }
};

class Derived : public Base  // 出现编译错误:无法继承 final 类
{
};

函数标记 final 后,编译器可以进行优化,因为它知道该函数不会被进一步重写,适用于需要明确终止继承链的类和函数的时候


原文地址:https://blog.csdn.net/dotdotyy/article/details/143649562

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!