手撕虛函式,虛函式呼叫虛函式

2021-10-01 07:14:23 字數 1314 閱讀 2463

乙個類的記憶體分布,虛函式表指標,普通成員變數,sizeof(a) = 為乙個虛表指標(32位是4位元組)+ 普通成員變數(靜態什麼的都不是)。虛函式本身也是函式,相當於乙個指標,虛函式表裡面含有虛函式,相當於乙個二級指標,虛函式表指標指向虛函式表,相當於乙個**指標,所有可以通過乙個**指標直接訪問某個虛函式。見**:

#include using namespace std;

class a

virtual void f()

virtual void g()

virtual void h()

~a()

};void test1()

virtual void func1()

};class son : public father

void func1() override

};void test2()

列印內容為:

father::func1() m_data = 1

son::func1() m_data = 2

******

father::func1() m_data = 1

******

son::func1() m_data = 2

子類構造之前,先呼叫父類構造,就m_data這個值,先找自己函式的作用域,再找其他作用域,有虛成員函式,但是沒有虛成員變數之說,若有虛成員變數,猜測m_data都為2。

class father

~father()

virtual void func1()

};class son : public father

~son()

void func1() override

~father()

virtual void func1()

virtual void func2()

};class son : public father

~son()

void func1() override {

cout << "son::func1() m_data = "《輸出結果:

father::func2() m_data = 1

son::func1() m_data = 2

s.father::func2();呼叫的是父類func2,而父類func2呼叫func1確實son::func1(),成員函式傳參的時候,預設有乙個指向呼叫該函式的物件指標,所以father::func2()儘管呼叫了,但是fun2()呼叫func1()時,傳入引數是子類物件s,所以呼叫的是子類的s::func1();

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...

虛函式 純虛函式

一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...

虛函式 純虛函式

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標引用來訪問基類和派生類中的同名函式。include using namespace std class student student類成員函式的實現 宣告抽象基類shape class shape virtual float...