乙個類的記憶體分布,虛函式表指標,普通成員變數,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...