看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《wagaru (wagaru)》之銘言: : 小弟還是c++的新手 : 有翻了一下 primer : 書上有說定義了純虛擬函式的類別是抽象類別 : 不能生成實例 : 只能被繼承 : 那這樣在這種抽象類別中有需要再定義一個virtual的解構式嗎? : 既然不能生成實例的話 : 應該就不會被配置資源也就不需解構了吧? 如果你不定義 virtual destructor 那麼繼承自這個抽象類別的子類別 即使定義了自己的 destructor 也不會被呼叫到 因為 compiler 在釋放一個指向抽象類別的指標時 他並不知道這個指標實際上指向哪個實體類別,自然不知道該類別是否有destructor 因此他只會看抽象類別的 destructor 如果抽象類別沒有宣告 destructor 他就不會解構了 造成資源洩漏 : 另外,我現在想用抽象類別來提供一個介面 : 裡面包含了這個類別都要實作的函式 : 但其中函式的參數會因不同的繼承者而不同 : 像是 std::string getName(.....) : derived class A 應該要 std::string getName(BinaryTree&) : derived class B 應該要 std::string getName(GeneralTree&) : 因為BinaryTree 跟 General Tree 都是繼承自AbstracTree : 不知道能不能在抽象類別中這樣寫 std::string getName(AbstractTree&)? 可以 但是你要在 A 和 B 的實作中使用 dynamic_cast 進行向下轉型 因為使用者可能會產生一個 class B 然後把 BinaryTree 傳進去 C++ 的 type system 無法在 compile time 避免這種事發生 所以需要在 runtime 進行檢查 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.86.71
wagaru:謝謝你的解釋~ 08/21 20:08