多型——具有多種形態。方法的行為應取決於呼叫該方法的物件。同乙個方法的行為隨上下文而異。
有兩種重要的機制實現多型共有繼承:
下面將具體實現:
類定義
#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...