C C 類的繼承 多型與虛函式 過載

2021-10-06 10:55:18 字數 3088 閱讀 5956

物件導向的程式設計主要目的是提供可重複利用的**。

類的繼承也是**重用的一種方式。

從已有的類(基類)派生出新的類,(派生類)繼承了原有類的特性,同時在其基礎上進行擴充套件增加功能。

1. 繼承

· 派生類可以訪問基類的公有成員;

· 派生類不能直接訪問基類的私有成員,必須通過基類的公有函式間接訪問私有成員——派生類的建構函式必須使用基類的建構函式;

classa;

classb:

public a //b繼承a

void

func4

(void)}

;

1.1 成員訪問許可權與繼承的關係:公有派生、私有派生

繼承方式

基類的public成員

基類的protected成員

基類的private成員

繼承引起的訪問許可權變化

public繼承

仍為public成員

仍為protected成員

不可見基類的非私有成員在子類的訪問屬性不變

protected繼承

變為protected成員

變為protected成員

不可見基類的非私有成員都變為子類的保護成員

private繼承

變為private成員

變為private成員

不可見基類的非私有成員都變為子類的私有成員

1.2派生類物件的構造/析構順序

構造:構造基類成員物件–>構造基類–>構造派生類成員物件–>構造派生類

析構:析構派生類–>析構派生類的成員物件–>析構基類–>析構基類的成員物件

1.3 派生類中的操作

改造基類成員:

宣告乙個和基類成員同名的新成員,對於成員函式引數表也應完全相同,這稱為同名覆蓋,否則是過載。派生類中的新成員就遮蔽了基類同名成員。

發展新成員:

派生類新成員必須與基類成員不同名,他的加入保證派生類在功能上有所擴充套件。

重寫建構函式與析構函式:

所謂不能繼承建構函式並不是不能利用基類的建構函式,而是把基類的建構函式作為新的建構函式的一部分或者說是呼叫基類的建構函式。

2. 多型

c++中的虛函式的作用主要是實現了多型的機制。

多型:用乙個名字定義不同的函式,呼叫同乙個名字的函式,執行不同的操作。

關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」。

利用多型技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。

c++有兩種多型:

——編譯時的多型:通過函式的過載與運算子的過載實現的

——執行時的多型:通過虛函式實現。執行時的多型是指在程式執行前,無法根據函式名和引數來確定呼叫哪乙個函式,必須在程式執行過程中,根據執行的具體情況來動態的確定。它是通過類繼承關係和虛函式來實現的。目的是建立一種通用的程式。

2.1 實現多型的基礎:

1.要有繼承

2.要有虛函式的重寫

3.基類指標(引用)指向子類的物件

2.2 虛函式

虛函式是乙個類的成員函式,在類成員函式前新增virtual關鍵字後,該函式就被稱作虛函式。有了虛函式之後就可以根據傳入物件的不同呼叫不同的成員函式

(在基類中通常將派生類重定義的函式,宣告為虛函式)

class

parent

virtual

printp()

private

:int a;};

class

son:

public parent

printp()

private

:int b;

};

基類與派生類的的同名函式要想實現多型,基類的同名函式前必須加上virtual關鍵字

2.3 純虛函式

純虛函式是特殊的虛函式,基類中不能給出這個虛函式的實現方法,派生類必須給出該函式的實現。這種特殊的函式稱為純虛函式,有純虛函式的類稱為抽象類,抽象類不能例項化物件,但是可以定義抽象類的指標或引用,派生類必須重寫方法後才能例項化物件。

class

base

//抽象類

~base()

vritual void

show()

=0;//純虛函式

private

:int _ma;

};

2.4 虛函式的注意事項

在基類函式的宣告中使用關鍵字 virtual ,可使得該函式在基類以及所有派生類中變成虛函式;

若使用指標物件的引用或者指標來呼叫虛函式,程式將使用物件型別定義的函式,而不使用引用或指標型別定義的函式(這使得基類的指標或引用可以指向派生類的物件)——動態聯編;

若定義的類將被用作基類,則應將那些要在派生類中重新定義的類函式宣告為虛的。

3 函式過載

函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。

· 函式過載必須在同乙個類中進行;

· 子類無法過載父類函式,父類同名函式將被子類同名函式覆蓋;

· 過載實在靜態聯編中實現。

以下為乙個print的例子:

#include

using

namespace std;

void

print

(int i)

void

print

(string str)

intmain()

通過上面**的實現,可以根據具體的print()的引數去呼叫print(int)還是print(string)

C C 繼承 多型和虛函式整理

關於c 中虛函式 1.怎麼初始化基類的建構函式 在派生類中,通過引數初始化表可以對基類的建構函式傳遞引數,進行初始化 2.多重繼承的二意性問題 可以將第二層派生類宣告為虛基類 盡量不要使用多重繼承 class b virtual public a class c virtual public a c...

C C 類的學習(四) 繼承與虛函式

物件導向程式設計的核心思想是資料抽象 繼承和動態繫結 也稱之為動態聯編 通過資料抽象將類的介面與實現分離 使用繼承可以定義相似的型別並對相似的關係建模 使用動態繫結可以在一定程度上忽視型別的區別,使用統一的方式使用他們的物件。類是c 實現物件導向程式設計的手段,乙個類把一類事物的相同屬性通過資料成員...

繼承多型與虛函式及對類的理解

b是a的子類,子類會繼承父類的public方法,子類物件可以呼叫父類的public介面,但是子類和父類函式重名時,父類的方法會被子類覆蓋 隱藏 子類呼叫和父類同名同參函式或者過載父類的函式後不可以直接呼叫父類函式,需要加a fun 呼叫,父類的protect方法只在繼承中有效,子類可以呼叫父類的pr...