[問題] Virtual函數在Destructor內的問題

看板C_and_CPP作者 ( )時間15年前 (2010/07/07 16:44), 編輯推噓0(005)
留言5則, 3人參與, 最新討論串1/2 (看更多)
#include <stdio.h> class A { public: ~A() { kerker(); } virtual void kerker() { printf("A is kerkering\n"); } }; class B : public A { public: virtual void kerker() { printf("B is kerkering\n"); } }; int main() { B* b = new B; A* a = b; a->kerker(); b->kerker(); delete b; return 0; } 程式如上,執行結果為 B is kerkering B is kerkering A is kerkering B 是 A 的 subclass,A 和 B 都有 kerker() 這個函數且為 virtual A 的 destructor 內也會呼叫 kerker() 現在造出一個 B 的 instance b 直接呼叫 b->kerker() 執行的當然是 class B 的 kerker() 就算轉型成 A 再呼叫,執行到的還是 class B 的 kerker() 但是當 delete B 時,會執行到 A 的 destructor 這時候 A 的 destructor 呼叫的 kerker() 卻變成是 class A 的 kerker() 了 這是為什麼呢? 請各位高手不吝賜教Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.215.187

07/07 16:45, , 1F
因為你的 ~A() 不是 virtual
07/07 16:45, 1F

07/07 16:48, , 2F
我有試過,就算加上 virtual 結果也是一樣!
07/07 16:48, 2F

07/07 16:48, , 3F
剛剛查了一下書,我搞錯了 orz
07/07 16:48, 3F

07/07 16:49, , 4F
P.S. 使用的 compiler 是 gcc 4.1.2
07/07 16:49, 4F

07/08 23:45, , 5F
Don't use the undefined behavior. Effective C++ 3rd.
07/08 23:45, 5F
文章代碼(AID): #1CD3vPou (C_and_CPP)
文章代碼(AID): #1CD3vPou (C_and_CPP)