override final default delete修飾的成員函數

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
{
};

3. default 和delete

=default、=delete 是C++11的新特性,分別爲:顯式缺省(告知編譯器生成函數默認的缺省版本)和顯式刪除(告知編譯器不生成函數默認的缺省版本)。C++11中引進這兩種新特性的目的是爲了增強對“類默認函數的控制”,從而讓程序員更加精準地去控制默認版本的函數

C++開發中,我們經常需要控制某些函數的生成。在C++11之前,我們經常的普遍做法是將其聲明爲類的 private 成員函數,這樣若在類外這些這些函數的操作時候,編譯器便會報錯,從而達到效果。

注:若缺省版本被刪除了,重載該函數是非法的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章