C++:override和final


1. override 重載

  當你在父類中使用了虛函數時候,你可能需要在某個子類中對這個虛函數進行重寫,以下方法都可以:

class A
{
    virtual void foo();
}
class B :public A
{
    void foo(); //OK
    virtual foo(); // OK
    void foo() override; //OK
}

  如果不使用override,當你手一抖,將foo()寫成了f00()會怎么樣呢?結果是編譯器並不會報錯,因為它並不知道你的目的是重寫虛函數,而是把它當成了新的函數。如果這個虛函數很重要的話,那就會對整個程序不利。

  所以,override的作用就出來了,它指定了子類的這個虛函數是重寫的父類的,如果你名字不小心打錯了的話,編譯器是不會編譯通過的:

class A
{
    virtual void foo();
};
class B :A
{
    virtual void f00(); //OK
    virtual void f0o()override; //Error 
};

  為了減少程序的運行時錯誤,還是養成重寫虛函數加上override的習慣吧。

2.final

  當不希望某個類被繼承,或不希望某個虛函數被重寫,可以在類名和虛函數后添加final關鍵字,添加final關鍵字后被繼承或重寫,編譯器會報錯。例子如下:

class Base
{
    virtual void foo();
};
 
class A : Base
{
    void foo() final; // foo 被override並且是最后一個override,在其子類中不可以重寫
    void bar() final; // Error: 父類中沒有 bar虛函數可以被重寫或final
};

class B final : A // 指明B是不可以被繼承的
{
    void foo() override; // Error: 在A中已經被final了
};
 
class C : B // Error: B is final
{
};

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM