有關多型的那點事丶

2021-08-04 15:38:20 字數 3456 閱讀 7446

前奏—虛函式表

虛函式表是通過一塊連續記憶體來儲存虛函式的位址.

這張表解決了繼承、 虛函式(重寫)的問題

在有虛函式的物件例項中都存在一張虛

函式表,虛函式表就像一張地圖指

明了實際應該呼叫的虛函式函式

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將其定義為彈性容器。彈性子元素 彈性容器內包含了乙個或多個彈性子元素。要點二 彈性盒子的作用範圍 彈性盒子...