繼承 is a關係

2021-07-14 11:07:52 字數 3183 閱讀 7019

c++有3種繼承方式:公有繼承、保護繼承、私有繼承。公有繼承是最常用的方式,它建立一種is-a關係,即派生類物件也是乙個基類物件,可以對基類物件執行的任何操作,也可以對派生類物件執行。

如果希望同乙個方法在派生類和基類中的行為是不同的,也就是說,方法的行為應取決於呼叫該方法的物件。這種較複雜的行為成為多型--具有多種形態,就是指同乙個方法的想行為隨上下文而異。有兩種機制可用於實現多型公有繼承:

1.在派生類中重新定義基類的方法。

2.使用虛方法。

為了說明上述性質,我們來看另乙個例子:乙個類用於 表示基本支票賬戶-brass,另乙個類用於表示代表brass plus支票賬戶,它新增了透支保護特性。也就是說,如果使用者簽出一張超出其存款餘額的支票--但是超出的數額不是很大,銀行將支付這張支票,對超出的部分收取額外的費用,並追加罰款。

下面是用於brass支票賬戶的資訊:

1.客戶姓名

2.賬戶

3.當前餘額

下面是可執行的操作:

1.建立賬戶

2.存款

3.取款

4.顯示賬戶資訊

而brass plus包含brass的所有資訊以及以下資訊項:

1.透支上限

2.透支貸款利率

3.當前透支總額

不需要新增操作,擔有兩種操作的實現不同

1.對於取款操作,必須考慮透支保護

2.顯示操作必須顯示brass plus賬戶的其他資訊

我們將第乙個類命名為brass,第二個類為brassplus。很明顯,應從prass公有派生出prassplus類。

程式清單 brass.h

account classes

#ifndef brass_h_

#define brass_h_

//brass account class

class brass

; char fullname[max];

long acctnum;

double balance;

public:

brass (const char *s = "nullbody",long an = -1,

double bal = 0.0);

void deposit(double amt);

virtual void withdraw(double amt);

double balance()const;

virtual void viewacct()const;

virtual ~brass(){}

};//brass plus account class

class brassplus: public brass

void reserate(double r)

void resetowes()

};#endif

對於上述程式清單,有以下說明:

brassplus類在brass類的基礎上新增了3個私有資料成員和3個公有成員函式。

brass類和brassplus類都宣告了viewacct()和widthdraw()方法,但brassplus物件和brass物件的這些方法的行為是不同的。

brass類在宣告viewacct()和withdraw()時使用了新關鍵字virtual。這些方法被稱為虛方法(virtual method)。

brass還宣告了乙個虛擬析構函式,雖然該函式沒進行任何操作。

記住:如果要在派生類中重新定義基類的方法,通常應將基類方法宣告為虛擬的,這樣,程式將根據物件型別而不是引用或指標的型別來選擇方法版本;為基類宣告乙個虛擬析構函式也是一種慣例。

程式清單 brass.cpp

account class methods

#include #include #include "brass.h"

using std::cout;

using std::ios_base;

using std::endl;

//brass methods

brass::brass(const char *s,long an,double bal)

void brass::deposit(double amt)

void brass::withdraw(double amt)

double brass::balance()const

void brass::viewacct()const

//brassplus methods

brassplus::brassplus(const char *s, long an,double bal,

double ml, double r):brass(s,an,bal)

brassplus::brassplus(const brass & ba, double ml,

double r):brass(ba)

//redefine how viewacct()works

void brassplus::viewacct()const

//redefine how withdraw()works

void brassplus::withdraw(double amt)

else

cout << "credit limit exceeded.transaction cancelled.\n";

cout.setf(initalstate);

}

解析:1.這裡面的建構函式都使用成員初始化列表句法,將基類的資訊傳遞給基類 的建構函式,然後使用建構函式初始化brassplus類新增的資料項。

2.非建構函式不能採用成員初始化列表句法,但派生類方法可以呼叫公有的基類方法。

記住:派生類並不能直接訪問基類的私有資料,而必須使用基類的公有方法才能訪問這些資料,訪問的方式取決於方法。

使用brass和brassplus類

程式清單 usebrass1.cpp

bank account classes

//compile with brass.cpp

#include #include "brass.h"

int main(int argc, char * argv [ ])

注意:如果在派生類中重新定義了基類的方法,則將它設定為虛方法,否則,設定為非虛方法。

繼承 is a關係

派生類和基類之間的特殊關係式基於c 繼承的底層模型的。實際上,c 有3個繼承方式 公用繼承 保護繼承和私有繼承。公有繼承是最常見的方式,他建立一種is a關係,即派生類物件也是乙個基類物件,可以對基類物件執行的任何操作,也可以對派生類物件執行。例如,假設有乙個fruit類,可以不吃水果的重量和熱量。...

C primer 十六 繼承 is a關係

派生類和基類之間的特殊關素是基於c 繼承的底層模型的。實際上c 有3種繼承方式 公有繼承 保護繼承和私有繼承。公有繼承是最常用的方式,它建立一種is a關係,即派生類物件也是乙個基類物件,可以對基類物件執行的任何操作,也可以對派生類物件執行。例如,假設有乙個fruit類,可以保護水果重量和熱量。因為...

Is a 和Has a之間關係

is a 和has a之間關係 可以這樣理解 汽車是一種交通工具 汽車 is a 交通工具 汽車有乙個發動機 汽車 has a 發動機 is a 一般是繼承關係 has a 一般是組合關係 或者這樣理解 has a 關係即組合關係,通過定義類的屬性的方式實現的 is a 關係即繼承關係,通過類繼承實...