基類型別物件入口索引子類物件
1.泛化的概念:由具體的,個別的擴大為一般的;將此概念應用於結構體和類物件,就是泛化能力。型別泛化指的是在繼承和派生時,基類派生出了很多不同的子類,形成了繼承樹,生成的子類都有自己獨特的性質,但是所有的子類都有自己的獨特性質,但是所有的子類都具有基類的性質,所以也可以看作是基類物件。
2.不同的子類物件都可以用基類指標索引到,但是如果用統一的方式索引到之後,遇到相同的函式入口,只會執行子類函式中的函式。也就是說,呼叫基類指標後,雖然指向的是派生類物件,但是呼叫的仍舊是基類的函式。如果想要呼叫派生類的話,應當將所有的同名函式設定為虛函式。
基類指標指向子類物件如何展現子類性質:虛函式
1.虛函式的概念:虛函式:在某基類中宣告為 virtual 並在乙個或多個派生類中被重新定義的成員函式。可以實現多型性。
2.動態繫結:虛函式和虛析構函式
含有虛函式的類要使用虛析構函式,否則容易導致派生類的資源無法釋放。
派生類的建構函式是先構造的基類的無名物件,析構的時候按照基類的型別析構。
所以也會呼叫小模組的析構函式。
當基類指標指向派生類物件時,加上virtual就可以呼叫派生類的析構函式去析構派生類物件。
3.抽象類和純虛函式
會發現有的類不需要產生物件,只是作為最頂層往下繼承,每乙個派生類的物件都是呼叫各自虛函式的函式體,因為基類裡虛函式的函式體可以忽略,變成了純虛函式,同時因為函式體不存在,也不能產生物件,變成了抽象類。
4.派生類建構函式執行的次序:
呼叫基類建構函式,呼叫順序按照它們被繼承時宣告的順序(從左到右);
呼叫內嵌成員物件的建構函式,呼叫順序按照它們在類中宣告的順序;
派生類的建構函式體中的內容。
**:
#include
#define pi 3.1415926
using
namespace std;
class
shape
shape
(int a,
int b)
:width
(a),
height
(b)void
set_values
(int a,
int b)
virtual
intarea()
=0;///純虛函式
~shape()
};class
circle
:public shape///圓
circle
(int a,
int b)
:shape
(a,b)
virtual
intarea()
};class
rectangle
:public shape///矩形
rectangle
(int a,
int b)
:shape
(a,b)
virtual
intarea()
~rectangle()
};class
********
:public shape///三角形
virtual
intarea()
~********()
};void
print_area
(shape& t1,shape& t2,shape& t3)
intmain()
輸出結果:
15030
3
物件導向的多型 多型性
多型指的是一類事物有多種形態,比如水有多種形態 冰 水 水蒸氣,但都是h2o,下面定義乙個h2o的父類和三種形態的子類 class h2o def init self,name,temperature self.name name self.temperature temperature deftu...
物件導向之多型 多型性
一 多型 多型指的是一類事物有多種形態 動物有多種形態 人,狗,豬 import abcclass animal metaclass abc.abcmeta 同一類事物 動物 abc.abstractmethod deftalk self pass class people animal 動物的形態...
c 物件導向系列2(多型性)
c 多型性的定義 同一操作作用於不同的類的例項,不同的類將進行不同的理解,最後產生不同的執行結果。c 支援兩種型別的多型性 1 編譯時的的多型性。編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的引數,返回的型別等資訊決定實現何種操作。2 執行時的多型性。執行時的多型性就...