淺談C++ 虛函數列表

概要

C++的封裝,繼承,多態 是它三個重要的內容。 而其中多態的實現,就涉及到了虛函數。 有虛函數的出現就可以稱之爲多態,就有關鍵字virtual 修飾的函數。 如virtual void function();
而如果 virtual void function() = 0; 這種就稱之爲純虛函數。 有純虛函數的類,又叫做抽象類。
純虛函數與普通虛函數寫法上的最明顯的是後面是否有“=0”, 而它的的特點是純虛函數是不能在本類內寫它的實現, 也就是子類繼承時,必須寫父類接口的實現。
而普通虛函數就是子類可以重寫父類的虛函數。而且父類的指針可以指向子類對象。
而虛函數表是編譯器爲有virtual 修辭的函數新建的一張表, 開闢了一塊對應的內存空間。


下面講的主要是虛函數表的一些簡單的實例:

單繼承,無重寫

class A {
virtual void a();
virtual void b();
};

class B : public A {
virtual void a1();
virtual void b1();
}

B *b;
//這種形勢的,不涉及到重寫,它的表現形勢爲
a b a1 b1
即爲依次出現

單繼承,有重寫

class A {
virtual void a();
virtual void b();
};

class B : public A {
virtual void a();
virtual void b1();
};

B* b;
//它的表爲
B::a() A::b B::b1
就是子類的重寫函數在最前。

多繼承,無重寫

class A {
virtual void a();
virtual void b();
};

class B {
virtual void a1();
virtual void b1();
};

class C : public A, public B
{
virtual void a2();
virtual void b2();
};

C *c ;
A::a() , A::b(), C::a2() , C:: b2 第一張表;
B::a1(), B::b1() 第二張表
C::a2, C::b2 第三張表

多繼承,有重寫

class A {
virtual void a();
virtual void b();
};

class B {
virtual void a();
virtual void b1();
};

class C : public A, public B
{
virtual void a();
virtual void b2();
};

C *c ;
C::a() , A::b(), C::a2() , C:: b2 第一張表;
C::a(), B::b1() 第二張表
C::a, C::b2 第三張表

發佈了88 篇原創文章 · 獲贊 52 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章