[英]Why are std::future and std::promise not final?
用std::vector
看看這個人為的(公認的荒謬)例子:
template <class T>
struct Example : private std::vector<T> {
void doStuff(const T& t) { this->push_back(t); }
T retrieveStuff() { return this->operator[](0); }
};
Example<int> e;
e.doStuff(42);
std::cout << e.retrieveStuff() << "\n";
這是有效的,你不能進入UB由於std::vector::~vector
不是virtual
因為你不能通過基類指針刪除對象(那里需要public
繼承)。
這里的繼承只是一個實現細節。 不建議練習,但人們可能會這樣做。 一旦決定不通過使std::vector
或其他容器類型final
來破壞現有代碼,那么堅持使用不同的詞匯類型(如std::promise
或std::future
是有意義的。
根據[派生] / 4 :
除非另有說明,否則C ++標准庫中指定的所有類型都應為非最終類型 。
並且std::future
或std::promise
也不例外。
正如評論中所提到的,此問題已在之前討論過。 庫實現者是否可以自由地將最終組件添加到非多態組件中? 。
該問題的解決方案是,結論不認為是缺陷:
除非庫在規范中使用關鍵字
final
,否則用戶顯然可以自由地從這樣的類派生,因此同樣清楚的是, 庫供應商沒有自由添加final
覆蓋或類屬性。
類中沒有任何虛函數不會使它不像Base類那樣具有資格。 在我看來,將virtual
函數添加到基類是一種使基類成為多態的特殊情況。 許多程序員不小心將virtual
功能放到了函數中,特別是對類的析構函數(並注釋“虛擬析構函數是必要的” )。
例如,ATL在很大程度上依賴於繼承,但沒有任何虛函數。 (基類)是非多態的。 大多數(如果不是全部)C ++ / STL類都是非多態的。
人們可能違反“更喜歡遏制/構成而不是繼承”的規則,並從一個不合邏輯的形式派生出一個類(由lubgr給出的一個例子); 但這是可行的,也是有效的。 有時從非多態類繼承而不是包含類更合適。
模板/模板元類依賴於不涉及虛函數的繼承。 屬性繼承是一個例子,其中一個類將繼承各種不同的類(多繼承),並繼承屬性。
一個非常簡單的例子是創建一個類non_copyable
,將copy-constructor / assignment-operator等作為private / protected; 並讓其他類繼承它。 這樣,“derived”類將繼承基類的不可復制的 “功能/屬性”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.