![](/img/trans.png)
[英]In final class derived from base class with virtual destructor, does derived class destructor need “virtual” keyword? Should it have “final” keyword?
[英]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()
。
如果不將函數標記為virtual
和final
那么子類仍然可以實現該函數並隱藏基類函數。
通過使函數virtual
和final
,子類不能覆蓋或隱藏函數。
是! 在您提供的示例中, 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.