日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++整理--虚函数

發布時間:2023/12/20 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++整理--虚函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、虛函數是這么實現的

解析:

  簡單的說,虛函數是通過虛函數表實現的,那么什么是虛函數表呢?

  事實上,如果一個類中含有虛函數表,則系統會為這個類分配一個指針成員指向一張虛函數表(vtbl),表中每一項指向一個虛函數的地址,實際上就是一個函數指針的數組。為了說明虛函數表,請看程序:

class Parent { public: virtual void foo1() {} virtual void foo2() {} void foo3(); }; class Child1 : public Parent { public: void foo1() {} void foo3(); }; class Child2 : public Parent { public: void foo1() {} void foo2() {} void foo3(); };

下面列出了各個類的虛函數表

Parent類的vtbl:Parent::foo1()的地址、Parent::foo2()。

Child1類的vtbl:Child1::foo1()的地址、Parent::foo2()。

Child2類的vtbl:Child2::foo1()的地址、Child2::foo2()。

  可以看出,虛函數表既有繼承性,又有多態性。每個派生類的vtbl繼承了它各個基類的vtbl,如果基類vtbl中包含某一項,則其派生類的vtbl中也包含同樣一項,但是兩項的值可能不同。如果派生類覆蓋(override)了該項對應的虛函數,則派生類vtbl的該項指向重載后的虛函數,如果沒有重載的話,則沿用基類的值。

  在類對象的內存布局中,首先是vtbl指針,然后才是對象的數據。在通過對象指針調用一個虛函數時,編譯器生成的代碼將先獲取對象類的vtbl指針,然后調用vtbl中對應的項。對于通過對象調用指針的情況,在編譯期間無法確定指針指向的是基類對象還是派生類對象,或者是哪個派生類對象。但是在運行期間執行到調用語句時,這一點已經確定,編譯后的調用代碼能夠根據具體對象獲取正確的vtbl,調用正確的虛函數,從而實現多態性。

  分析一下這里的思想所在,問題的實質是這樣,對于發出虛函數調用的這個對象指針,在編譯期間缺乏更多的信息,而在運行期間具備足夠的信息,但那時已不再進行綁定了,怎么在二者之間做一個過渡呢?把綁定所需的信息用一種通用的數據結構記錄下來,該數據結構可以同對象指針相聯系,在編譯時只需要使用這個數據結構進行抽象的綁定,而在運行期間將會得到真正的綁定。這個數據結構就是vtbl。可以看到,實現用戶所需的抽象和多態需要進行后綁定,而編譯器又是通過抽象和多態實現后綁定的。


二、構造函數調用虛函數

#include <iostream> using namespace std; class A { public: A() { doSth(); } //構造函數調用虛函數 virtual void doSth() { printf("I am A"); } }; class B : public A { public: virtual void doSth() { printf("I am B"); } }; int main() { B b; return 0;
執行結果是什么?為什么?

  在構造函數中,虛擬機制不會發生作用,因為基類的構造函數在派生類構造函數之前執行,當基類構造函數執行時,派生類數據成員還沒有被初始化。如果基類構造函數期間調用的虛函數向下匹配到派生類,派生類的函數理所應當會涉及本地數據成員,但是那些數據成員還沒有被初始化,而調用涉及一個對象還沒有被初始化的部分自然是危險的,所以c++會提示此路不通。因此,虛函數不會向下匹配到派生類,而是直接執行基類的函數。

結果:


  • I?am?A?

  • 總結

    以上是生活随笔為你收集整理的c++整理--虚函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。