多型共有繼承

2021-09-27 08:47:17 字數 3367 閱讀 2532

多型——具有多種形態。方法的行為應取決於呼叫該方法的物件。同乙個方法的行為隨上下文而異。

有兩種重要的機制實現多型共有繼承:

下面將具體實現:

類定義

#ifndef mytime_h_

#define mytime_h_

#include

class brass};

class brassplus : public brass

//重置最大貸款數目

void

ressrate

(double r)

//重置利率

void

ressowes()

//重置欠賬為0};

#endif

基類:brass   私有資料成員: fullname,acctnum, balance

派生類: brassplus   新增派生私有資料成員: maxloan,rate,owesbank

函式的具體實現:

#include

"ss.h"

#include

using std:

:endl;

using std:

:cout;

using std:

:string;

typedef std:

:ios_base:

:fmtflags format;

typedef std:

:streamsize precis;

format setformat()

;void

restore

(format f, precis p)

;brass:

:brass

(const string& s,

long an,

double bal)

void brass:

:deposit

(double amt)

void brass:

:withdraw

(double amt)

double brass:

:balance()

const

void brass:

:viewacct()

const

brassplus:

:brassplus

(const string& s,

long an,

double bal,

double ml,

double r)

:brass

(s, an, bal)

brassplus:

:brassplus

(const brass& ba,

double ml,

double r)

:brass

(ba)

void brassplus:

:viewacct()

const

void brassplus:

:withdraw

(double amt)

else

cout <<

"credit limit execeeded. transaction cancelled.\n"

;restore

(initialstate, prec);}

format setformat()

void

restore

(format f, precis p)

因為派生類不能直接訪問基類的私有資料,而必須使用基類公有的方法才能訪問這些資料。

派生類建構函式在初始化基類私有資料時,採用的是成員初始化列表語法。例項的實現方法:

brassplus:

:brassplus

(const string& s,

long an,

double bal,

double ml,

double r)

:brass

(s, an, bal)

brassplus:

:brassplus

(const brass& ba,

double ml,

double r)

:brass

(ba)

這幾個建構函式都是使用成員初始化列表語法,將基類資訊傳遞給基類建構函式,然後使用建構函式體初始化類新增的資料項。

非建構函式不能使用成員初始化列表語法,但派生類方法可以呼叫基類方法。

同時注意**使用作用域運算子來呼叫基類方法。

void brassplus:

:viewacct()

const

如果沒有使用作用域解析符,編譯器就會認為viewacct()brassplus::viewacct(),這樣建立了乙個不會終止的遞迴函式。所以在實現時要加上::

僅使用brass和brassplus類:

#include

#include

"ss.h"

intmain()

使用虛方法的行為:

#include

#include

"ss.h"

const

int clients =4;

intmain()

while

(cin.

get()!=

'\n'

)continue;}

cout << endl;

for(

int i =

0; i < clients; i++

)for

(int i =

0; i < clients; i++

) cout <<

"done.\n"

;return0;

}

函式分析——虛析構函式

使用delete釋放由new分配的物件**說明為何基類應包含乙個虛析構函式,雖然有時候用不到。如果虛析構函式不是虛的,那麼將只能呼叫對應指標型別的析構函式。對於以上程式來說,使用delete時,只有brass的析構函式被呼叫,即使指標指向的是brassplus型別的物件。析構函式是虛的,則將會呼叫相應物件型別的析構函式。虛構函式可以確保正確的析構函式被呼叫。

但是如果brassplus包含乙個執行某些操作的析構函式,那麼brass必須有乙個虛構函式,即使這個虛構函式不執行任何操作。

C 繼承 共有,私有,保護

公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。2.私有繼承 private...

C 繼承 共有,私有,保護

公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。2.私有繼承 private...

C 繼承 共有,私有,保護

公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。2.私有繼承 private...