Re: [問題] c++ 抽象類別的繼承
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間14年前 (2011/08/21 13:31)推噓1(1推 0噓 0→)留言1則, 1人參與討論串2/2 (看更多)
※ 引述《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
推
08/21 20:08, , 1F
08/21 20:08, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章