1樓:匿名使用者
虛擬函式用於實現類的繼承所體現的多型性,當一個類的成員函式被宣告為虛的,那麼這個類的派生類如果過載了這個函式,那麼在呼叫這個函式時,會先確認這個類例項是原來的類還是派生類(因為父類的指標可以指向子類)如果是父類,那麼呼叫父類的版本,如果是子類,則呼叫對應的子類的版本。
class a
; };
class b :public a
};int main()
else
p->f();
//當你輸入0時指標p指向一個a型別的變數,所以呼叫的是a::f()
//當你輸入非0時,指標p指向一個b型別的變數,所以呼叫的是b::f()
//這就是虛擬函式奇妙之所在,一般函式是作不到的,對於一般的函式呼叫
//的函式在編譯時就確定了。假如f是非虛擬函式,那麼永遠呼叫的是a::f()
//因為p是a*型別
return 0;
}建構函式不能是虛擬函式,而解構函式在某些情況下必須為虛擬函式(比如你想讓你類能夠被繼承,那麼這個類的解構函式最好是虛的,繼承一個解構函式不是虛的類是有風險的),值得補充的是,當基類的函式是虛擬函式,子類的過載的函式也是虛的,及時不加virtual關鍵字也是虛的。
2樓:匿名使用者
非也 非也,虛擬函式是與函式過載區分的,虛擬函式是在執行。exe檔案時確定呼叫哪一個函式的,而函式過載則是在編譯時候就確定了要呼叫哪一個函式
3樓:
建構函式不能宣告為虛擬函式,因為在執行建構函式時類物件還沒完成建立過程,當然談不上函式與類物件的繫結
4樓:匿名使用者
虛擬函式是用是實現多型。也可以為將來升級程式帶來好處 解構函式可以是虛的建構函式不行
c++中 解構函式中可以呼叫虛擬函式麼
5樓:育知同創教育
c++中 析構
函式中不可以呼叫虛擬函式。
effective c++ 中有這樣的描述:同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c++ 就將它們視為不再存在。
c++中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的解構函式再呼叫基類的建構函式。
假設一個派生類的物件進行析構,首先呼叫了派生類的析構,然後在呼叫基類的析構時,遇到了一個虛擬函式,這個時候有兩種選擇:plan a是編譯器呼叫這個虛擬函式的基類版本,那麼虛擬函式則失去了執行時呼叫正確版本的意義;plan b是編譯器呼叫這個虛擬函式的派生類版本,但是此時物件的派生類部分已經完成析構,「資料成員就被視為未定義的值」,這個函式呼叫會導致未知行為。
6樓:回頭的世界
很簡單,你定義一個虛擬函式,然後在解構函式中呼叫看看,debug除錯,能執行就證明可以!
自己動手比實踐,比問別人「記住」一些規則,更有效果!
7樓:徐霄沛
是可以的,不過,這樣呼叫沒有什麼意義,不能實現多型。
c 關於解構函式的問題,C 關於解構函式的一個問題
如果你的物件在複製的時候不適合淺複製,而且整個過程中你也不需要對它進行復制,那麼一個比較好的方法就是寫一個複製建構函式 mystring const mystring 然後不實現。沒錯就是隻寫這麼一個宣告放那邊。如果程式中用到了複製構造,那麼連結的時候就會報錯,可以幫助你遠離深複製淺複製的問題。另 ...
c什麼時候使用虛擬函式,什麼是虛擬函式,C虛擬函式講解
虛擬函式就是在基類中被關鍵字virtual說明,並在派生類中重新定義的函式。虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。虛擬函式就是為了讓基類指標 或引用 能訪問派生類中定義的成員。什麼是虛擬函式,c 虛擬函式講解 在某基類中宣告...
帶了虛方法解構函式就一定要virtual嗎
先說說什麼時候是必須使用解構函式的 只有需要刪除堆中生成的物件時,才必須使用解構函式。什麼時候需要使用虛解構函式 1當用基類的指標指向子類物件,此時如果只是呼叫解構函式就只會執行基類的解構函式而不執行子類的解構函式。此時就要用到虛解構函式。因為虛解構函式可以動態繫結到子類物件。從而正確地析構。2子類...