簡體   English   中英

將final關鍵字添加到沒有基類的類中的虛函數(未派生)是否有意義

[英]Does it make sense to add final keyword to the virtual function in a class that has no base class (is not derived)

我正在閱讀一篇非常棒的C ++ 11教程 ,作者在解釋final關鍵字的同時提供了這個例子:

struct B {
    virtual void f() const final;   // do not override
    virtual void g();
};
struct D : B {
    void f() const;     // error: D::f attempts to override final B::f
    void g();       // OK
};

那么在這里使用final關鍵字是否有意義? 在我看來,你可以避免在這里使用virtual關鍵字,並防止被覆蓋f()

如果不將函數標記為virtualfinal那么子類仍然可以實現該函數並隱藏基類函數。

通過使函數virtualfinal ,子類不能覆蓋隱藏函數。

是! 在您提供的示例中, final關鍵字可以防止任何派生類覆蓋f()正如您所說的那樣。 如果函數是非虛函數,則允許D:f() 隱藏函數的基類版本:

struct B {
    void f() const;   // do not override
    virtual void g();
};
struct D : B {
    void f() const; // OK!
    void g();       // OK
};

通過使f()成為virtual函數和final函數,任何覆蓋或隱藏的嘗試都會導致編譯錯誤。

你的直覺是正確的:使一個virtual函數只能立即用final函數限制它對非虛函數沒有任何好處。 這只是展示該功能的簡短示例代碼段。

另外,如其他答案中所述,這實際上會破壞函數隱藏 - 您將無法在D或其任何派生類中使用具有相同參數列表的f函數。
這是一個權衡,當你決定帽做f在你的模型。 由於無法在此處執行實際的虛擬呼叫,因此您基本上處於劣勢並且沒有任何好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM