1. 程式人生 > >對《深入C++物件模型》中的一個疑問——虛擬函式表的type_info的位置

對《深入C++物件模型》中的一個疑問——虛擬函式表的type_info的位置

在《深入C++物件模型》中,介紹vptr的指向時,第一個指向的是type_info,其次才是第一個虛擬函式的地址。但參考了下面這篇文章和其中的例子後,而且也經過自己的實驗,發現不是那麼回事,vptr指向的第一個位置其實是第一個虛擬函式的地址。

有下面幾句程式碼:

Aclass* ptra=new Bclass;
 98    int** ptrvf=(int**)(ptra);
 99    RTTICompleteObjectLocator str=100        *((RTTICompleteObjectLocator*)(*((int*)ptrvf[0]-1)));

可以明顯看到,虛表地址減1之後才得到型別資訊。

結論:vptr指向的第一個位置是第一個虛擬函式的地址,不是type_info。

ISO C++標準並沒有確切定義type_info,它的確切定義編譯器相關的,但是標準卻規定了其實現必需提供如下四種操作(在之後的章節中我會來分析type_info類檔案的原始碼):

 t1 == t2  如果兩個物件t1和t2型別相同,則返回true;否則返回false
 t1 != t2  如果兩個物件t1和t2型別不同,則返回true;否則返回false
 t.name()  返回型別的C-style字串,型別名字用系統相關的方法產生
 t1.before(t2)  返回指出t1是否出現在t2之前的bool值



相關推薦

深入C++物件模型一個疑問——虛擬函式type_info位置

在《深入C++物件模型》中,介紹vptr的指向時,第一個指向的是type_info,其次才是第一個虛擬函式的地址。但參考了下面這篇文章和其中的例子後,而且也經過自己的實驗,發現不是那麼回事,vptr指向的第一個位置其實是第一個虛擬函式的地址。 有下面幾句程式碼:

C++物件模型虛擬函式分析

對於虛擬函式,知道它的含義,也能夠描述出來。參照百度百科,也就是“它提供了‘動態繫結’機制”。 可總是感覺有些迷糊,於是敲了一段程式碼出來試驗,一探究竟(程式設計環境是VC6.0)。對比程式碼和結果,一切都不言自明。 現在把程式碼和結果貼上來,作為儲存記錄,同時也歡迎大家提出意見,以臻完善。

物件深入C++物件模型

Matrix identity //Matrix 是一個類 main() { //identity必須放在此處初始化 Matrix m1= identify; ... return 0; } C++ 保證,一定會在main函式中第一次用到identi

深入c++物件模型之執行期語意學

1.物件的構造與解構   一般而言,constructor 和 destructor的安插都會如你所預期:       //c++偽碼     {       Point point;       //point.Point::Point();一般而言會被安插在這裡    

C++虛擬函式儲存位置淺析

關於C++中虛擬函式表,我們知道這樣一些事實: 1. 當class中存在virtual函式時,編譯器會為這個class追加一個void** __vfptr資料成員。 2. C++程式執行時,實際函式的呼叫,是通過查詢__vfptr來獲取的,從而實現多型。 3. 多型的實現,

C++ 類的儲存方式以及虛擬函式

一、C++成員函式在記憶體中的儲存方式   用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件的資料和函式程式碼分配儲存單元,如下圖所示。  

c++多型的原理 以及虛擬函式詳解

c++中多型的原理 要實現多型,必然在背後有自己的實現機制,如果不瞭解其背後的機制,就很難對其有更深的理解。 一個多型的例子 class Person{ public: virtual void Drink() { cout << "drink water" &

C++遲後聯編和虛擬函式

先看一個題目: class Base { public: virtual void Show(int x) { cout << "In Base class, int x = " << x << endl; } }

[讀書筆記] 深入探索C++物件模型-第四章-Function語義學(

繼續整理第四章的內容,注:以下部分圖片來自於原文 1. 單繼承情況下的虛擬函式呼叫:  對於多型虛擬函式的呼叫(通過基類指標或者引用),例如ptr->z();,需要知道兩個資訊:     a. ptr所指物件的真實型別,這可以使我們選擇正確的z()實體;     b.

深入探索C++物件模型(五)

https://www.cnblogs.com/lengender-12/p/6970496.html 構造、解構、拷貝語意學(Semantics of Construction,Destruction, and Copy) 一般而言,class的data member應該被初始化,並且只在

深入探索C++物件模型:Default-Constructor的構造操作

那麼,什麼時候才會合成出一個default constructor呢?——當編譯器需要它的時候!此外,被合成出來的constructor只執行編譯器所需的行動。 [x] “任何class如果沒有定義default constructors,就會被合成出一個來”?——錯 [x] “編譯

深入探索C++物件模型(四)

https://www.cnblogs.com/lengender-12/p/6959222.html Function語意學(The Semantics of Function) static member functions不可能做到的兩點:(1)直接存取n

深入理解C++物件模型之建構函式

一、前言     學習C++的同學一般都知道有建構函式這個東西,我相信很多同學的理解就是建構函式是用來初始化類成員的,是的,建構函式的本質確實是這樣的,但很多同學會有以下兩個誤解:         (1)任何class如果沒有定義任何建構函式,編譯器就會幫你自動生成一個;

[讀書筆記] 深入探索C++物件模型-第一章《關於物件

最新在看深入探索C++物件模型(Inside C++ object model),看的同時針對一些之前沒有留意或者理解不深的內容整理一下讀書筆記,方便之後複習,也希望可以幫助到有同樣疑惑的人。 下面是

深入探索C++物件模型(九) 解構函式 (以及顯式定義的解構函式問題、解構函式Rules of Three)

  如果類沒有定義解構函式,那麼只有類中含有成員物件(或者本類的基類)擁有解構函式的情況下,編譯器才會合成一個出來,否則解構函式被視為不要,也就不需要合成。例如,如下類,雖然Point類擁有虛擬函式:class Point {  piblic:       Point(flo

深入探索C++物件模型(六) Function語義學

1. 非虛成員函式指標(非靜態)。取一個非靜態成員函式的地址,如果該函式是非虛擬函式,則得到的是它在記憶體中的真正地址,但是該地址並不完全,需要繫結與具體的類例項(物件)之上,藉助物件的地址(this指標)才可以被呼叫,例如:一個成員函式指標double (Point::* 

Objective-C 物件模型深入理解

0x00序 本著加深對Objective-C 物件模型的理解和記憶目的,於是有了下文的簡單實踐操作。 0x01 疑問 在以下程式碼中,你能描述清楚以下問題嗎? TestClass的例項物件tcA和tcB的記憶體結構是怎麼樣的 TestClass

深入探索C++物件模型》第六章 執行語意學

#include <iostream> class X { public: bool operator==(const X& o) { return ((this == &o)?true:false); } ~X() { std::co

深入探索C++物件模型》讀後總結

第一章:關於物件 1:C++每個類物件的記憶體大小由:類中非靜態成員記憶體的和,指向虛擬函式表的指標和記憶體對齊的記憶體三者共同決定。 記憶體如何對齊,我以前寫過一篇博文裡講的很詳細。 2:虛擬函式表裡存放的是虛擬函式的記憶體地址,物件呼叫虛擬函式就是通過

Java-JUC(二):volatileJava內存模型的可見性、原子性、有序性影響

UC volatil 可見 模型 原子性 有序性 juc 內存模型 volatile Java內存模型 Java內存模型-可見性 Java內存模型-原子性 Java內存模型-有序性 volatile-是否具有可見性? volatile