前奏—虛函式表
虛函式表是通過一塊連續記憶體來儲存虛函式的位址.
這張表解決了繼承、 虛函式(重寫)的問題
在有虛函式的物件例項中都存在一張虛
函式表,虛函式表就像一張地圖指
明了實際應該呼叫的虛函式函式
1.什麼是多型 ?
所謂多型性就是不同物件收到相同的訊息時,產生不同的動作。直觀來說,多型性是指用乙個名字定義不同的函式,這些函式執行不同但又類似的操作,從而可以使用相同的方式來呼叫這些具有不同功能的同名函式。簡單的說:就是用基類的引用指向子類的物件。
多型的分類:
編譯時的多型性。編譯時的多型性是通過過載來實現的。
執行時的多型性。動態多型就是通過繼承重寫基類的虛函式實現的多型,因為是在執行時決議確定,所以稱為動態多型。
實現多型的方法:虛函式,抽象類,覆蓋,模板。
構成多型的條件:
1.要有繼承 。
2.要有虛函式的重寫。
3.父類的指標/引用呼叫虛函式。
構成多型時,和型別無關,和呼叫的物件有關。
使用多型的好處:
多型性機制不僅增加了物件導向軟體系統的靈活性,進一步減少了冗餘資訊,而且顯著提高了軟體的可重用性和可擴充星星。多型的應用可以使程式設計顯得更簡便.更便利。
多型的應用:
上述例項中父類a的指標指向父類物件時,則呼叫父類的函式fun1(),當指標指向子類時,則呼叫子類fun1().
單繼承物件模型
class base
virtual
void func2()
private:
int a;
};class derive :public base
virtual
void func3()
virtual
void func4()
private:
int b;
};typedef
void(*func) ();
void printvtable(int* vtable)
cout
<< endl;
}int main()
首先子類的func1()重寫了父類的func1(),虛表裡存的是子類的func1(),接下來父類的func2(),子類的func3(),func4()都是虛函式,所以虛表裡會有4個元素,分別為子類的fun1(),父類fun2(),子類fun3(),子類fun4()。
多繼承物件模型
監視顯示有base1和base2兩個虛表,但是在監視中我們並沒有發現子類的func3函式!!!!
除錯結果顯示func3()沒有自己開闢虛函式表,也沒有存在base2的虛函式表中,而是存在了base1的虛函式表中,由此我們得出當涉及多繼承時,子類的虛函式會存在先繼承的那個類的虛函式表裡。
物件模型–菱形虛擬繼承
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
class base1
public:
int _a;
};class base2 :virtual
public base1
virtual
void fun2()
public:
int _b;
};class base3 :virtual
public base1
virtual
void fun2()
public:
int _c;
};class base4 : public base2, public base3
virtual
void fun2()
public:
int _d;
};typedef
void(*func) ();
void printvtable(int* vtable)
cout
<< endl;
}int main()
base2 base3 中重寫了base1中的fun1() base4繼承了 base2 and base3 重寫了fun1() fun2()
除錯結果
有關String的那點事
1 string str1 abc system.out.println str1 abc 步驟 1 棧中開闢一塊空間存放引用str1 2 string池中開闢一塊空間,存放string常量 abc 3 引用str1指向池中string常量 abc 4 str1所指代的位址即常量 abc 所在位址,...
有關css居中 那點事
前言 怎麼說呢?我以前只知道margin 0 auto 從來沒想過會這麼高深,自從學習了慕課網,我才明白了原來css居中是有很多學問的。首先來說一下分類。分類指的是對什麼樣的元素來進行居中,不同的元素對應不同的方法。1.行內元素 2.定寬的 塊狀元素 定寬的,也就是加了width 100px 這種。...
有關彈性盒子的那點事
彈性盒子 要點一 彈性盒子其實是由兩部分組成 彈性容器 flex container 和彈性子元素 flex item 彈性容器 通過設定display屬性的值為flex或inline flex將其定義為彈性容器。彈性子元素 彈性容器內包含了乙個或多個彈性子元素。要點二 彈性盒子的作用範圍 彈性盒子...