1. 程式人生 > >C++中虛擬函式表儲存位置淺析

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

關於C++中虛擬函式表,我們知道這樣一些事實:

1. 當class中存在virtual函式時,編譯器會為這個class追加一個void** __vfptr資料成員。

2. C++程式執行時,實際函式的呼叫,是通過查詢__vfptr來獲取的,從而實現多型。

3. 多型的實現,必須用指標或引用才能實現,拷貝物件或轉換物件是無法實現的。

基於以上事實,我理解:

C++中虛擬函式表儲存位置,是class,不是object。

當程式編譯時,編譯器為每個class分配了虛擬函式表 vtable(class),儲存位置應該是無法修改的常量區域 。

建立物件時,根據物件型別,為物件中void** __vfptr(object)賦值。

物件轉換時,根據物件型別,重寫物件中void** __vfptr(object)。

指標或引用不涉及物件轉換。

反過來,只有void** __vfptr儲存在class時,才能符合上面的事實。

以上是2016/7/15面試題引發的思考,也是我的第一篇部落格,請大家多多指教。

相關推薦

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

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

淺析C++虛擬函式的呼叫及物件的內部佈局

     在我那篇《淺析C++中的this指標》中,我通過分析C++程式碼編譯後生成的彙編程式碼來分析this指標的實現方法。這次我依然用分析C++程式碼編譯後生成的彙編程式碼來說明C++中虛擬函式呼叫的實現方法,順便也說明一下C++中的物件內部佈局。下面所有的彙編程式碼都是

[C/C++]C++虛擬函式的原理和虛擬函式

#include using namespace std; class A{     public:     A();     virtual void fun1();     void fun2(); }; A::A() { } void A::fun1() {     cout<<"I am

c++虛擬函式的理解

虛擬函式的作用,事實上就是實現了多型性,就是實現以共同的方法,但因個體差異而採用不同的策略。下面有程式碼例項來描述: class A{ public: void print(){ cout<<”This is A”<<endl;} }; class B:publ

C++通過虛擬函式呼叫虛擬函式

    C++的類如果有虛擬函式,則該類的第一個成員的數值,是一個地址,指向其虛擬函式表。例如     class CTest { public: virtual void Test1(void) { cout<&l

C++虛擬函式函式

解構函式為什麼要宣告為虛 函式??? 基類的解構函式需要宣告為虛擬函式:  當派生類物件經由一個基類指標被刪除,而該基類帶著一個non-virtual解構函式,實際執行時通常發生的是物件的派生類成員沒有被銷燬。這也就是區域性銷燬,會發生記憶體洩漏,所以我們通常將基類的解構函式需要宣告為

C++虛擬函式工作原理

C++中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。 所謂泛型技術,比如:模板技術,RTTI技術,虛擬函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議。 虛擬函式表(

C++虛擬函式工作原理和 虛 繼承類的記憶體佔用大小計算

                      虛擬函式的實現要求物件攜帶額外的資訊,這些資訊用於在執行時確定該物件應該呼叫哪一個虛擬函式。典型情況下,這一資訊具有一種被稱為 vptr(virtual table pointer,虛擬函式表指標)的指標的形式。vptr 指向一個被稱為 vtbl(virtual t

c++虛擬函式和純虛擬函式定義

      只有用virtual宣告類的成員函式,使之成為虛擬函式,不能將類外的普通函式宣告為虛擬函式。因為虛擬函式的作用是允許在派生類中對基類的虛擬函式重新定義。所以虛擬函式只能用於類的繼承層次結構中。      一個成員函式被宣告為虛擬函式後,在同一類族中的類就不能

關於c++虛擬函式和介面的關係區分(簡單)

虛擬函式:                 虛擬函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛擬函式後,可以在基類的派生類中對虛擬函式重新定義,在派生類中重新定義的函式應與虛擬函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義

C++虛擬函式的作用是什麼?它應該怎麼用呢?

虛擬函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對C++的虛擬函式這玩意兒的理解。 一, 什麼是虛擬函式 (如果不知道虛擬函式為何物,但有急切的想知道,那你就應該從這裡開始)簡單地說,那些被virtual關鍵字修飾的成員

c++const常量的儲存位置探討

首先看一段詭異的程式碼: #include <stdio.h> int main() { const float intValue=2.2; float *j=(float *)&intValue; *j=1.1; printf("int

C++虛擬函式不能是inline函式的原因

在C++中,inline關鍵字和virtual關鍵字分別用來定義c++中的行內函數和虛擬函式,他們在各自的場合都有其各自的應用,下面將簡單介紹他們各自的功能,然後在說明為什麼一個函式不能同時是虛擬函式和行內函數(inline)

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

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

C++虛擬函式在虛繼承和繼承的差別

下面的程式碼在gcc和VC中的結果 #include <cstdio> class A { public: virtual void funcaa() { printf("class A %s\n",__func__); } }; class AA:virtual pu

(C/C++學習筆記)4.C++類虛擬函式Virtual Table

1 #include <iostream> 2 using namespace std; 3 4 class base 5 { 6 public: 7 virtual void f(){cout<<"base::f()"<<endl;}

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

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

C++ 關於類與物件在虛擬函式上唯一性問題 淺析

【摘要】 很多教材上都有介紹到虛指標、虛擬函式與虛擬函式表,有的說類物件共享一個虛擬函式表,有的說,一個類物件擁有一個虛擬函式表;還有的說,無論使用者聲明瞭多少個類物件,但是,這個VTABLE虛擬函式表只有一個;也有的在說,每個具有虛擬函式的類的物件裡面都有一個VPTR虛擬

C++單繼承與多重繼承下的虛擬函式

轉自:http://www.cnblogs.com/Z465360621/articles/4561344.html 虛擬函式表,以及虛擬函式指標: 1)每個有虛擬函式的類都有自己的虛擬函式表,每個包含虛擬函式的類物件都有虛擬函式表指標。 2)對於多重繼承

C++虛擬函式()實現機制詳解

前言大家都應該知道C++的精髓是虛擬函式吧? 虛擬函式帶來的好處就是: 可以定義一個基類的指標, 其指向一個繼承類, 當通過基類的指標去呼叫函式時, 可以在執行時決定該呼叫基類的函式還是繼承類的函式. 虛擬函式是實現多型(動態繫結)/介面函式的基礎. 可以說: 沒有虛擬函式,