C 學習筆記 繼承與多型

2021-06-19 11:31:11 字數 1821 閱讀 8091

1:關於繼承(inheritance)的概念

在c++中有「has a" 和 "is a"的 兩個概念。 

1.1  」 has a「即為在乙個類定義中包含另乙個類的物件:

class a

class b;

1.2: "is a" 即我們說的繼承: 如下,b繼承a, a為基類,b為a的派生類,b繼承了a的所有資料成員和成員函式。

class a: public class b

1.3: 關於upcasting 和downcasting

1.3.1: 因派生類繼承了基類的所有資料成員和成員函式,因此指向基類的指標或引用可以指向派生類物件。

這即為隱式upcasting 強制轉換。

b b; a &a = b;

b b; a *a = &b;

1.3.2:  因派生類不但繼承了基類的所有資料成員和成員函式,還增加自己獨有的資料成員或成員函式,

因此不能直接將將乙個派生類的引用或指類直接指向乙個基類物件,因為派生類的部分資料成員呀

成員函式可能沒有。

class a

class b: public a

a  a; 

b &b = a; //不能這樣做

a  a;

b *b = &a; //不能這樣做

1.4: 關於虛函式

1.41 派生類不僅可能會增加成員函式也可能重定義基類的實現的函式以實現派生類所需要的功能。

c++引入虛函式概念(virtual), 基類將該成員函式宣告為virtual函式,派生類則可以重定義基類中已實現的成員函式

以實現不同的功能。這樣因為呼叫成員函式的物件型別不同而使得函式實現的功能不同即為多型。

class a

virtual  method1(arg1);

class b:public a

virtual method(arg1,arg2);

1.4.2:  如基類的某個成員函式被宣告的virtual,則其在派生類也為virtual。

1.4.3: 派生類中重定義的virtual函式會隱藏其類中的函式過載。如想使該成員函式在派生類中也過載,

則應在派生類對中每個virtual過載函式重新定義

class a

;class b:public a

;1.4: 關於動態繫結和靜態繫結

1.4.1: 靜態繫結 即編譯時繫結:編譯時根據函式名和函式引數列表來決定執行哪個函式.

eg:

class a

;class b:public a

;a a;

a &b = a;

a.method1(arg1);//這時呼叫 的是a.0000000000method1(arg1);

b b;

a &a = b;

a.method1(arg1);       //這時仍然呼叫 的是a.method1(arg);

1.4.2: 動態繫結: 因為派生類中可能重定了基類中的成員函式(vitual函式),因此有時需

根據呼叫成員函式的物件型別來選擇使用哪個成員函式定義來執行,這即為

動態繫結。

eg:class a

;class b:public a

;b b;

a &a = b;

b.method1(arg1);//這時呼叫 的是b.method1(arg1);

a a;

a &b = a;

b.method1(arg1);       //這時呼叫 的是a.method1(arg);

1.5:關於虛析構函式

不管是否宣告了虛成員函式,都有必要宣告乙個虛析構函式,儘管它可能什麼也沒做。

c 學習筆記( )繼承與多型

1.繼承的作用 復用 2.派生類繼承基類的什麼東西 除了基類的構造和析構函式以外的所有成員 3.public 任意位置都可以訪問 protected 本類類中,子類類中訪問 private 本類類中訪問 基類中不同的訪問限定符下的成員以不同的繼承方式在派生類中的訪問限定 public protect...

C 之多型與繼承學習筆記

如果子類定義了與父類中原型相同的函式會發生什麼?例如class parent public void print cout i m parent.public void print cout i m child.使用時 child child child.print child.parent pri...

C 學習筆記(二) 繼承與多型

繼承 定義派生類要在類識別符號後面新增乙個冒號,接著新增基類名稱 如下 class person 定義基類person c 3.0 可以簡寫 public string gender private int age 不簡寫,新增正值判斷 public int age set public void ...