1樓:走路都帶風聲
因為基bai類的解構函式
du不是虛解構函式,
zhi所以是根據指標的型別呼叫dao解構函式,而不是根版據指權針指向物件的型別呼叫解構函式。
虛擬函式是在基類中被宣告為 virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載。
當一個類作為基類時,它的解構函式應該為虛解構函式。
c++中 解構函式中可以呼叫虛擬函式麼
2樓:育知同創教育
c++中 析構
函式中不可以呼叫虛擬函式。
effective c++ 中有這樣的描述:同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c++ 就將它們視為不再存在。
c++中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的解構函式再呼叫基類的建構函式。
假設一個派生類的物件進行析構,首先呼叫了派生類的析構,然後在呼叫基類的析構時,遇到了一個虛擬函式,這個時候有兩種選擇:plan a是編譯器呼叫這個虛擬函式的基類版本,那麼虛擬函式則失去了執行時呼叫正確版本的意義;plan b是編譯器呼叫這個虛擬函式的派生類版本,但是此時物件的派生類部分已經完成析構,「資料成員就被視為未定義的值」,這個函式呼叫會導致未知行為。
3樓:回頭的世界
很簡單,你定義一個虛擬函式,然後在解構函式中呼叫看看,debug除錯,能執行就證明可以!
自己動手比實踐,比問別人「記住」一些規則,更有效果!
4樓:徐霄沛
是可以的,不過,這樣呼叫沒有什麼意義,不能實現多型。
是不是隻有虛擬函式才能定義為純虛擬函式,c++語法。
5樓:千鋒教育
你概念有點混淆了,這個virtual void fun()=0; 是純虛擬函式;virtual void fun(); 是虛擬函式。它們是有區別的。有純虛擬函式的類一般都是虛基類,主要用於繼承,讓子類來實現虛擬函式。
虛擬函式的作用當然是多型了~~
class base
{public:
void base::fun() {cout<<"base" return 0; } 如果fun 是虛擬函式顯示什麼,不是虛擬函式顯示什麼?自己試試 a.純虛擬函式是一種特殊的虛擬函式,它沒 6樓: 簡單說來,類的每個函式都必須能夠實現(建構函式比較特殊,不定義的話,系統會自動定義,不違背法則)。純虛擬函式是沒有實現的函式,如果用來定義物件,那麼就會有函式沒有實現。不理解也沒辦法。。 class cc 過載 覆蓋 隱藏的bai區別和執行du方式成員函式 被過載zhi的特徵 1 相dao同的範圍 專在同一個類中 屬 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 ... 全部繼承是什麼意思?繼承了這個類,這個類的方法當然全部有的?你是不是想問是不是應該子類全部實現它的虛擬函式?不用的 只要不是純虛擬函式就可以不用實現,直接用父類的就可以的 c 中父類的虛擬函式必須要實現嗎 虛擬函式是自帶實現的,因此派生類中可以選擇實現自己的,也可以直接使用基版類的。但是純虛擬函式一... 你那不叫重灌,叫語法錯誤。你在定義hujiaoqi類的時候已經實現建構函式的過載了,即一專個是無參的建構函式hujiaoqi 一個是有參的hujiaoqi int 類的建構函式只呼叫一次,而且不管有多少個建構函式,屬只會呼叫其中一個,並且是在定義物件的時候自動呼叫的,具體是呼叫哪個根據定義物件時傳入...c虛繼承與普通繼承問題,c 虛繼承與普通繼承問題
c中父類中虛擬函式要全部繼承嗎,C中父類的虛擬函式必須要實現嗎
C建構函式過載的問題,C建構函式和解構函式可以過載嗎