概要
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 第三張表