您好,登錄后才能下訂單哦!
小編給大家分享一下C++中虛函數內存結構是怎么樣的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
虛函數的內存結構虛函數的內存結構
一、 基本概念
C++中的虛函數的作用主要是實現了多態的機制。
關于多態,簡而言之就是用父類型別的指針指向其子類的實例,然后通過父類的指針調用實際子類的成員函數。這種技術可以讓父類的指針有“多種形態”,這是一種泛型技術。
所謂泛型技術,說白了就是試圖使用不變的代碼來實現可變的算法。比如:模板技術,RTTI技術,虛函數技術,要么是試圖做到在編譯時決議,要么試圖做到運行時決議。
二、 虛函數的定義與派生類中的重定義
class 類名
{
public:
virtual 成員函數說明;
}
class 類名:訪問修飾符 基類名
{
public:
virtual 成員函數說明;
}
三、 虛函數在內存中的結構
1.我們先看一個例子
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun0() { cout << "A::fun0" << endl; }
};
int main(void)
{
A a;
cout << "size
of A = " << sizeof(a) << endl;
return 0;
}
結果:size of A = 4
2.如果再添加一個虛函數
virtual void fun1() { cout << "A::fun1" << endl; }
得到相同的結果。如果去掉函數前面的virtual修飾符 結果:size of A = 1
3.在看下面的結果
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun0() { cout << "A::fun0" << endl; }
int a;
int b;
};
int main(void)
{
A a;
cout << "size
of A = " << sizeof(a) << endl;
return 0;
}
結果:size of A = 12
在 lip32 平臺下指針在內存中占4個字節,虛函數在一個虛函數表(VTABLE)中保存函數地址。
在看下面例子:
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun0() { cout << "A::fun0" << endl; }
virtual void fun1() { cout << "A::fun1" << endl; }
};
int main(void)
{
A a;
cout << "size
of A = " << sizeof(a) << endl;
return 0;
}
結果:
size of A = 4
4.我們再來看看繼承中虛函數的內存結構
先看下面的例子
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun0() { cout << "A::fun0" << endl; }
};
class B
{
public:
virtual void fun0() { cout << "B::fun0" << endl; }
};
class C
{
public:
virtual void fun0() { cout << "C::fun0" << endl; }
};
class D : public A, public B, public C
{};
int main(void)
{
D d;
cout << "size
of D = " << sizeof(d) << endl;
return 0;
}
結果:size is = 12
以上是“C++中虛函數內存結構是怎么樣的”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。