【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数
生活随笔
收集整理的這篇文章主要介紹了
【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
加qq1126137994 微信:liu1126137994 一起學習更多技術!!!
問題一:構造函數與析構函數可以成為虛函數么?
答案:
1、構造函數不可以成為虛函數
因為在構造函數執行結束后,虛函數表指針才被正確的初始化完成
2、析構函數可以成為虛函數
建議在設計類時,尤其是存在繼承的類時,將析構函數設計為虛函數
問題二:構造函數與析構函數中會發生多態行為么?
答案:
1、構造函數中不可能發生多態行為:
因為在構造函數執行結束前,虛函數表指針沒有正確的初始化完成
2、析構函數中不可能發生多態行為:
因為在析構函數執行時,虛函數表指針已經被銷毀
如果構造函數與析構函數中調用了虛函數,那么只調用當前類中定義的虛函數版本
看下面的實例程序:
#include <iostream> #include <string>using namespace std;class Base { public:Base(){cout << "Base()" << endl;func();//在構造函數中不會發生多態行為,雖然func()函數為虛函數//但是編譯器不會去動態綁定,會直接調用本類中的成員函數}virtual void func() {cout << "Base::func()" << endl;}virtual ~Base(){func(); //在析構函數中也不會發生多態行為,當編譯器發現析構函數中有虛函數時//編譯器不會實現動態綁定的行為,而是直接調用本類中的成員函數cout << "~Base()" << endl;} };class Derived : public Base { public:Derived(){cout << "Derived()" << endl;func();//在構造函數中不會發生多態行為,雖然func()函數為虛函數//但是編譯器不會去動態綁定,會直接調用本類中的成員函數}virtual void func(){cout << "Derived::func()" << endl;}~Derived(){func();//在析構函數中也不會發生多態行為,當編譯器發現析構函數中有虛函數時//編譯器不會實現動態綁定的行為,而是直接調用本類中的成員函數cout << "~Derived()" << endl;} };int main() {Base* p = new Derived();// ...delete p;return 0; }運行結果為:
Base()
Base::func()
Derived()
Derived::func()
Derived::func()
~Derived()
Base::func()
~Base()
由運行結果,我們也很容易看出上面相關結論的正確性!
總結
以上是生活随笔為你收集整理的【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel制作简单账本
- 下一篇: KNX数据格式,温度转换