簡體   English   中英

為什么std :: future和std :: promise不是最終的?

[英]Why are std::future and std::promise not final?

我覺得為什么類std::futurestd::promise沒有用final說明符標記。 析構函數 不是虛擬的,為什么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::promisestd::future是有意義的。

根據[派生] / 4

除非另有說明,否則C ++標准庫中指定的所有類型都應為非最終類型

並且std::futurestd::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.

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