推 wagaru:謝謝你的解釋~ 08/21 20:08
※ 引述《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