第7章 繼承與派生_第1頁(yè)
第7章 繼承與派生_第2頁(yè)
第7章 繼承與派生_第3頁(yè)
第7章 繼承與派生_第4頁(yè)
第7章 繼承與派生_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七章類(lèi)的繼承清華大學(xué)鄭莉目錄7.1類(lèi)的繼承與派生7.2訪問(wèn)控制7.3類(lèi)型兼容規(guī)則7.4派生類(lèi)的構(gòu)造、析構(gòu)函數(shù)7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)7.6程序?qū)嵗酶咚瓜シń饩€性方程組7.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序7.8深度探索7.9小結(jié)27.1類(lèi)的繼承與派生繼承與派生是同一過(guò)程從不同的角度來(lái)看保持已有類(lèi)的特性而構(gòu)造新類(lèi)的過(guò)程稱(chēng)為繼承。在已有類(lèi)的基礎(chǔ)上新增自己的特性而產(chǎn)生新類(lèi)的過(guò)程稱(chēng)為派生。被繼承的已有類(lèi)稱(chēng)為基類(lèi)(或父類(lèi))。派生出的新類(lèi)稱(chēng)為派生類(lèi)。37.1類(lèi)的繼承與派生繼承與派生的目的繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問(wèn)題出現(xiàn),原有程序無(wú)法解決(或不能完全解決)時(shí),需要對(duì)原有程序進(jìn)行改造。47.1類(lèi)的繼承與派生——7.1.1派生與繼承的實(shí)例7.1.2派生類(lèi)的聲明單繼承時(shí)class派生類(lèi)名:繼承方式基類(lèi)名{

成員聲明;}例如:classDerived:publicBase1{public: Derived(); ~Derived();};57.1類(lèi)的繼承與派生——7.1.2派生類(lèi)的定義繼承方式一個(gè)派生類(lèi)同時(shí)有多個(gè)基類(lèi),稱(chēng)為多繼承一個(gè)派生類(lèi)只有一個(gè)基類(lèi),稱(chēng)為單繼承直接參與派生出某類(lèi)的基類(lèi)稱(chēng)為直接基類(lèi),基類(lèi)的基類(lèi)甚至更高層的基類(lèi)稱(chēng)為間接基類(lèi)。派生類(lèi)成員是指除了從基類(lèi)繼承而來(lái)的數(shù)據(jù)成員和函數(shù)成員之外,新增加的數(shù)據(jù)和函數(shù)成員67.1.3派生類(lèi)生成過(guò)程吸收基類(lèi)成員吸收基類(lèi)成員之后,派生類(lèi)實(shí)際上就包含了它的全部基類(lèi)中除構(gòu)造和析構(gòu)函數(shù)之外的所有成員。改造基類(lèi)成員如果派生類(lèi)聲明了一個(gè)和某基類(lèi)成員同名的新成員(如果是成員函數(shù),則參數(shù)表也要相同,參數(shù)不同的情況屬于重載),派生的新成員就覆蓋了外層同名成員添加新的成員派生類(lèi)新成員的加入是繼承與派生機(jī)制的核心,是保證派生類(lèi)在功能上有所發(fā)展77.1類(lèi)的繼承與派生7.2訪問(wèn)控制不同繼承方式的影響主要體現(xiàn)在:派生類(lèi)成員對(duì)基類(lèi)成員的訪問(wèn)權(quán)限通過(guò)派生類(lèi)對(duì)象對(duì)基類(lèi)成員的訪問(wèn)權(quán)限三種繼承方式公有繼承私有繼承保護(hù)繼承87.2訪問(wèn)控制7.2.1公有繼承(public)基類(lèi)的public和protected成員的訪問(wèn)屬性在派生類(lèi)中保持不變,但基類(lèi)的private成員不可直接訪問(wèn)。派生類(lèi)中的成員函數(shù)可以直接訪問(wèn)基類(lèi)中的public和protected成員,但不能直接訪問(wèn)基類(lèi)的private成員。通過(guò)派生類(lèi)的對(duì)象只能訪問(wèn)基類(lèi)的public成員。97.2訪問(wèn)控制——7.2.1公有繼承10例7-1公有繼承舉例//Point.h#ifndef_POINT_H#define_POINT_HclassPoint{ //基類(lèi)Point類(lèi)的定義public: //公有函數(shù)成員

voidinitPoint(floatx=0,floaty=0){this->x=x;this->y=y;} voidmove(float

offX,floatoffY){x+=offX;y+=offY;} floatgetX()const{returnx;} floatgetY()const{returny;}private: //私有數(shù)據(jù)成員

floatx,y;};#endif//_POINT_H7.2訪問(wèn)控制——7.2.1公有繼承11例7-1(續(xù))//Rectangle.h#ifndef_RECTANGLE_H#define_RECTANGLE_H#include"Point.h"classRectangle:publicPoint{ //派生類(lèi)定義部分public: //新增公有函數(shù)成員

voidinitRectangle(floatx,floaty,floatw,floath){

initPoint(x,y);//調(diào)用基類(lèi)公有成員函數(shù)

this->w=w; this->h=h; } floatgetH()const{returnh;} floatgetW()const{returnw;}private: //新增私有數(shù)據(jù)成員

floatw,h;};#endif//_RECTANGLE_H7.2訪問(wèn)控制——7.2.1公有繼承12例7-1(續(xù))#include<iostream>#include<cmath>usingnamespacestd;intmain(){ Rectanglerect; //定義Rectangle類(lèi)的對(duì)象

//設(shè)置矩形的數(shù)據(jù)

rect.initRectangle(2,3,20,10); rect.move(3,2); //移動(dòng)矩形位置

cout<<"Thedataofrect(x,y,w,h):"<<endl; //輸出矩形的特征參數(shù)

cout<<rect.getX()<<"," <<rect.getY()<<"," <<rect.getW()<<"," <<rect.getH()<<endl; return0;}7.2訪問(wèn)控制——7.2.1公有繼承7.2.2私有繼承(private)基類(lèi)的public和protected成員都以private身份出現(xiàn)在派生類(lèi)中,但基類(lèi)的private成員不可直接訪問(wèn)。派生類(lèi)中的成員函數(shù)可以直接訪問(wèn)基類(lèi)中的public和protected成員,但不能直接訪問(wèn)基類(lèi)的private成員。通過(guò)派生類(lèi)的對(duì)象不能直接訪問(wèn)基類(lèi)中的任何成員。137.2訪問(wèn)控制——7.2.2私有繼承14例7-2私有繼承舉例//Point.h#ifndef_POINT_H#define_POINT_HclassPoint{ //基類(lèi)Point類(lèi)的定義public: //公有函數(shù)成員

voidinitPoint(floatx=0,floaty=0){this->x=x;this->y=y;} voidmove(float

offX,floatoffY){x+=offX;y+=offY;} floatgetX()const{returnx;} floatgetY()const{returny;}private: //私有數(shù)據(jù)成員

floatx,y;}; #endif//_POINT_H7.2訪問(wèn)控制——7.2.2私有繼承15例7-2(續(xù))//Rectangle.h#ifndef_RECTANGLE_H#define_RECTANGLE_H#include"Point.h"classRectangle:privatePoint{ //派生類(lèi)定義部分public: //新增公有函數(shù)成員

voidinitRectangle(floatx,floaty,floatw,floath){

initPoint(x,y);//調(diào)用基類(lèi)公有成員函數(shù)

this->w=w; this->h=h; } voidmove(float

offX,floatoffY){

Point::move(offX,offY); } floatgetX()const{returnPoint::getX();

} floatgetY()const{returnPoint::getY();

} floatgetH()const{returnh;} floatgetW()const{returnw;}private: //新增私有數(shù)據(jù)成員

floatw,h;};#endif//_RECTANGLE_H7.2訪問(wèn)控制——7.2.2私有繼承16例7-2(續(xù))#include<iostream>#include<cmath>usingnamespacestd;intmain(){

Rectangle

rect; //定義Rectangle類(lèi)的對(duì)象

rect.initRectangle(2,3,20,10); //設(shè)置矩形的數(shù)據(jù)

rect.move(3,2); //移動(dòng)矩形位置

cout<<"Thedataofrect(x,y,w,h):"<<endl;

cout<<rect.getX()<<"," //輸出矩形的特征參數(shù)

<<rect.getY()<<"," <<rect.getW()<<"," <<rect.getH()<<endl; return0;}7.2訪問(wèn)控制——7.2.2私有繼承7.2.3保護(hù)繼承(protected)基類(lèi)的public和protected成員都以protected身份出現(xiàn)在派生類(lèi)中,但基類(lèi)的private成員不可直接訪問(wèn)。派生類(lèi)中的成員函數(shù)可以直接訪問(wèn)基類(lèi)中的public和protected成員,但不能直接訪問(wèn)基類(lèi)的private成員。通過(guò)派生類(lèi)的對(duì)象不能直接訪問(wèn)基類(lèi)中的任何成員177.2訪問(wèn)控制——7.2.3保護(hù)繼承protected成員的特點(diǎn)與作用對(duì)建立其所在類(lèi)對(duì)象的模塊來(lái)說(shuō),它與private

成員的性質(zhì)相同。對(duì)于其派生類(lèi)來(lái)說(shuō),它與public

成員的性質(zhì)相同。既實(shí)現(xiàn)了數(shù)據(jù)隱藏,又方便繼承,實(shí)現(xiàn)代碼重用。187.2訪問(wèn)控制——7.2.3保護(hù)繼承19例:protected成員舉例classA{protected:

intx;};intmain(){ Aa;

a.x=5;//錯(cuò)誤}7.2訪問(wèn)控制——7.2.3保護(hù)繼承20例(續(xù))classA{protected:

intx;};classB:publicA{public: voidfunction();};voidB:function(){ x=5;//正確}7.2訪問(wèn)控制——7.2.3保護(hù)繼承7.3類(lèi)型轉(zhuǎn)換規(guī)則一個(gè)公有派生類(lèi)的對(duì)象在使用上可以被當(dāng)作基類(lèi)的對(duì)象,反之則禁止。具體表現(xiàn)在:派生類(lèi)的對(duì)象可以隱含轉(zhuǎn)換為基類(lèi)對(duì)象。派生類(lèi)的對(duì)象可以初始化基類(lèi)的引用。派生類(lèi)的指針可以隱含轉(zhuǎn)換為基類(lèi)的指針。通過(guò)基類(lèi)對(duì)象名、指針只能使用從基類(lèi)繼承的成員217.3類(lèi)型轉(zhuǎn)換規(guī)則22例7-3類(lèi)型轉(zhuǎn)換規(guī)則舉例#include<iostream>usingnamespacestd;classBase1{//基類(lèi)Base1定義public: voiddisplay()const{

cout<<"Base1::display()"<<endl; }};classBase2:publicBase1{//公有派生類(lèi)Base2定義public: voiddisplay()const{

cout<<"Base2::display()"<<endl; }};classDerived:publicBase2{//公有派生類(lèi)Derived定義public: voiddisplay()const{

cout<<"Derived::display()"<<endl; }};7.3類(lèi)型轉(zhuǎn)換規(guī)則23例7-3(續(xù))voidfun(Base1*ptr){ //參數(shù)為指向基類(lèi)對(duì)象的指針

ptr->display(); //"對(duì)象指針->成員名"}intmain(){ //主函數(shù)

Base1base1; //聲明Base1類(lèi)對(duì)象

Base2base2; //聲明Base2類(lèi)對(duì)象

Derivedderived; //聲明Derived類(lèi)對(duì)象

fun(&base1); //用Base1對(duì)象的指針調(diào)用fun函數(shù) fun(&base2); //用Base2對(duì)象的指針調(diào)用fun函數(shù)

fun(&derived);//用Derived對(duì)象的指針調(diào)用fun函數(shù) return0;}7.3類(lèi)型轉(zhuǎn)換規(guī)則運(yùn)行結(jié)果:Base1::display()Base1::display()Base1::display()絕對(duì)不要重新定義繼承而來(lái)的非虛函數(shù)基類(lèi)與派生類(lèi)的關(guān)系單繼承多繼承多重繼承由一個(gè)基類(lèi)派生出多個(gè)派生類(lèi)多層繼承247.1.2派生類(lèi)的聲明多繼承時(shí)class

派生類(lèi)名:繼承方式1基類(lèi)名1,

繼承方式2基類(lèi)名2,...{

成員聲明;}注意:每一個(gè)“繼承方式”,只用于限制對(duì)緊隨其后之基類(lèi)的繼承。257.1類(lèi)的繼承與派生——7.1.2派生類(lèi)的定義多繼承舉例classA{public: voidsetA(int); voidshowA()const;private:

inta;};classB{public: voidsetB(int); voidshowB()const;private:

intb;};classC:publicA,privateB{public: voidsetC(int,int,int); voidshowC()const;privateconst:

intc;};267.2訪問(wèn)控制多繼承舉例(續(xù))voidA::setA(intx){ a=x;}voidB::setB(intx){ b=x;}voidC::setC(intx,inty,intz){ //派生類(lèi)成員直接訪問(wèn)基類(lèi)的

//公有成員

setA(x);

setB(y); c=z;}//其他函數(shù)實(shí)現(xiàn)略intmain(){ Cobj; obj.setA(5);

obj.showA(); obj.setC(6,7,9);

obj.showC();//obj.setB(6);錯(cuò)誤//obj.showB();錯(cuò)誤

return0;}277.2訪問(wèn)控制繼承時(shí)的構(gòu)造函數(shù)基類(lèi)的構(gòu)造函數(shù)不被繼承,派生類(lèi)中需要聲明自己的構(gòu)造函數(shù)。定義構(gòu)造函數(shù)時(shí),只需要對(duì)本類(lèi)中新增成員進(jìn)行初始化,對(duì)繼承來(lái)的基類(lèi)成員的初始化,自動(dòng)調(diào)用基類(lèi)構(gòu)造函數(shù)完成。派生類(lèi)的構(gòu)造函數(shù)需要給基類(lèi)的構(gòu)造函數(shù)傳遞參數(shù)287.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)單一繼承時(shí)的構(gòu)造函數(shù)派生類(lèi)名::派生類(lèi)名(基類(lèi)所需的形參,本類(lèi)成員所需的形參):基類(lèi)名(參數(shù)表),本類(lèi)成員初始化列表{ //其他初始化;};297.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)30單一繼承時(shí)的構(gòu)造函數(shù)舉例#include<iostream>usingnamecpacestd;classB{public: B();

B(inti); ~B(); voidprint()const;private:

intb;};7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)31單一繼承時(shí)的構(gòu)造函數(shù)舉例(續(xù))B::B(){ b=0;

cout<<"B'sdefaultconstructorcalled."<<endl;}B::B(inti){ b=i;

cout<<"B'sconstructorcalled."<<endl;}B::~B(){

cout<<"B'sdestructorcalled."<<endl;}voidB::print()const{

cout<<b<<endl;}7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)32單一繼承時(shí)的構(gòu)造函數(shù)舉例(續(xù))classC:publicB{public: C();

C(inti,intj); ~C(); voidprint()const;private:

intc;};C::C(){ c=0;

cout<<"C'sdefaultconstructorcalled."<<endl;}C::C(int

i,intj):B(i),c(j){

cout<<"C'sconstructorcalled."<<endl;}7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)33單一繼承時(shí)的構(gòu)造函數(shù)舉例(續(xù))C::~C(){

cout<<"C'sdestructorcalled."<<endl;}voidC::print()const{

B::print();

cout<<c<<endl;}intmain(){ Cobj(5,6);

obj.print(); return0;}7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)多繼承時(shí)的構(gòu)造函數(shù)派生類(lèi)名::派生類(lèi)名(參數(shù)表):基類(lèi)名1(基類(lèi)1初始化參數(shù)表),基類(lèi)名2(基類(lèi)2初始化參數(shù)表),...基類(lèi)名n(基類(lèi)n初始化參數(shù)表),本類(lèi)成員初始化列表{//其他初始化;};347.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)派生類(lèi)與基類(lèi)的構(gòu)造函數(shù)當(dāng)基類(lèi)中聲明有缺省構(gòu)造函數(shù)或未聲明構(gòu)造函數(shù)時(shí),派生類(lèi)構(gòu)造函數(shù)可以不向基類(lèi)構(gòu)造函數(shù)傳遞參數(shù),也可以不聲明,構(gòu)造派生類(lèi)的對(duì)象時(shí),基類(lèi)的缺省構(gòu)造函數(shù)將被調(diào)用。當(dāng)需要執(zhí)行基類(lèi)中帶形參的構(gòu)造函數(shù)來(lái)初始化基類(lèi)數(shù)據(jù)時(shí),派生類(lèi)構(gòu)造函數(shù)應(yīng)在初始化列表中為基類(lèi)構(gòu)造函數(shù)提供參數(shù)。357.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)多繼承且有內(nèi)嵌對(duì)象時(shí)的構(gòu)造函數(shù)派生類(lèi)名::派生類(lèi)名(形參表):基類(lèi)名1(參數(shù)),基類(lèi)名2(參數(shù)),...基類(lèi)名n(參數(shù)),本類(lèi)對(duì)象成員和基本類(lèi)型成員初始化列表{//其他初始化};367.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)構(gòu)造函數(shù)的執(zhí)行順序調(diào)用基類(lèi)構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時(shí)聲明的順序(從左向右)。對(duì)本類(lèi)成員初始化列表中的基本類(lèi)型成員和對(duì)象成員進(jìn)行初始化,初始化順序按照它們?cè)陬?lèi)中聲明的順序。對(duì)象成員初始化是自動(dòng)調(diào)用對(duì)象所屬類(lèi)的構(gòu)造函數(shù)完成的。執(zhí)行派生類(lèi)的構(gòu)造函數(shù)體中的內(nèi)容。377.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)38例7-4派生類(lèi)構(gòu)造函數(shù)舉例#include<iostream>usingnamespacestd;classBase1{ //基類(lèi)Base1,構(gòu)造函數(shù)有參數(shù)public: Base1(inti){cout<<"ConstructingBase1"<<i<<endl;}};classBase2{ //基類(lèi)Base2,構(gòu)造函數(shù)有參數(shù)public: Base2(intj){cout<<"ConstructingBase2"<<j<<endl;}};classBase3{ //基類(lèi)Base3,構(gòu)造函數(shù)無(wú)參數(shù)public: Base3(){cout<<"ConstructingBase3*"<<endl;}};7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)39例7-4(續(xù))classDerived:publicBase2,publicBase1,publicBase3{//派生新類(lèi)Derived,注意基類(lèi)名的順序public: //派生類(lèi)的公有成員

Derived(inta,intb,intc,intd):Base1(a),member2(d),member1(c),Base2(b) {} //注意基類(lèi)名的個(gè)數(shù)與順序,//注意成員對(duì)象名的個(gè)數(shù)與順序private: //派生類(lèi)的私有成員對(duì)象

Base1member1; Base2member2; Base3member3;};intmain(){ Derivedobj(1,2,3,4); return0;}7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.1構(gòu)造函數(shù)運(yùn)行結(jié)果:constructingBase22constructingBase11constructingBase3*constructingBase13constructingBase24constructingBase3*7.4.2復(fù)制構(gòu)造函數(shù)若建立派生類(lèi)對(duì)象時(shí)沒(méi)有編寫(xiě)復(fù)制構(gòu)造函數(shù),編譯器會(huì)生成一個(gè)隱含的復(fù)制構(gòu)造函數(shù),該函數(shù)先調(diào)用基類(lèi)的復(fù)制構(gòu)造函數(shù),再為派生類(lèi)新增的成員對(duì)象執(zhí)行拷貝。若編寫(xiě)派生類(lèi)的復(fù)制構(gòu)造函數(shù),則需要為基類(lèi)相應(yīng)的復(fù)制構(gòu)造函數(shù)傳遞參數(shù)。例如:

C::C(constC&c1):B(c1){…}407.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)7.4.3析構(gòu)函數(shù)析構(gòu)函數(shù)也不被繼承,派生類(lèi)自行聲明聲明方法與一般(無(wú)繼承關(guān)系時(shí))類(lèi)的析構(gòu)函數(shù)相同。不需要顯式地調(diào)用基類(lèi)的析構(gòu)函數(shù),系統(tǒng)會(huì)自動(dòng)隱式調(diào)用。析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反。417.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.3析構(gòu)函數(shù)42例7-5派生類(lèi)析構(gòu)函數(shù)舉例#include<iostream>usingnamespacestd;classBase1{ //基類(lèi)Base1,構(gòu)造函數(shù)有參數(shù)public: Base1(inti){cout<<"ConstructingBase1"<<i<<endl;} ~Base1(){cout<<"DestructingBase1"<<endl;}};classBase2{ //基類(lèi)Base2,構(gòu)造函數(shù)有參數(shù)public: Base2(intj){cout<<"ConstructingBase2"<<j<<endl;} ~Base2(){cout<<"DestructingBase2"<<endl;}};classBase3{ //基類(lèi)Base3,構(gòu)造函數(shù)無(wú)參數(shù)public: Base3(){cout<<"ConstructingBase3*"<<endl;} ~Base3(){cout<<"DestructingBase3"<<endl;}};7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.3析構(gòu)函數(shù)43例7-5(續(xù))classDerived:publicBase2,publicBase1,publicBase3{//派生新類(lèi)Derived,注意基類(lèi)名的順序public: //派生類(lèi)的公有成員

Derived(inta,intb,intc,intd):Base1(a),member2(d),member1(c),Base2(b){} //注意基類(lèi)名的個(gè)數(shù)與順序,注意成員對(duì)象名的個(gè)數(shù)與順序private: //派生類(lèi)的私有成員對(duì)象

Base1member1; Base2member2; Base3member3;};intmain(){ Derivedobj(1,2,3,4); return0;}7.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.3析構(gòu)函數(shù)44例7-5(續(xù))運(yùn)行結(jié)果:ConstructingBase22ConstructingBase11ConstructingBase3*ConstructingBase13ConstructingBase24ConstructingBase3*DestructingBase3DestructingBase2DestructingBase1DestructingBase3DestructingBase1DestructingBase27.4派生類(lèi)的構(gòu)造和析構(gòu)函數(shù)——7.4.3析構(gòu)函數(shù)7.5.1作用域限定當(dāng)派生類(lèi)與基類(lèi)中有相同成員時(shí):若未特別限定,則通過(guò)派生類(lèi)對(duì)象使用的是派生類(lèi)中的同名成員。如要通過(guò)派生類(lèi)對(duì)象訪問(wèn)基類(lèi)中被隱藏的同名成員,應(yīng)使用基類(lèi)名和作用域操作符(::)來(lái)限定。457.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)46例7-6多繼承同名隱藏舉例#include<iostream>usingnamespacestd;classBase1{ //定義基類(lèi)Base1public: intvar; voidfun(){cout<<"MemberofBase1"<<endl;}};classBase2{ //定義基類(lèi)Base2public: intvar; voidfun(){cout<<"MemberofBase2"<<endl;}};classDerived:publicBase1,publicBase2{//定義派生類(lèi)Derivedpublic: intvar; //同名數(shù)據(jù)成員

voidfun(){cout<<"MemberofDerived"<<endl;} //同名函數(shù)成員};7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定47例7-6(續(xù))intmain(){ Derivedd; Derived*p=&d; d.var=1; //對(duì)象名.成員名標(biāo)識(shí)

d.fun(); //訪問(wèn)Derived類(lèi)成員

d.Base1::var=2; //作用域操作符標(biāo)識(shí)

d.Base1::fun(); //訪問(wèn)Base1基類(lèi)成員

p->Base2::var=3; //作用域操作符標(biāo)識(shí)

p->Base2::fun(); //訪問(wèn)Base2基類(lèi)成員

return0;}7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定二義性問(wèn)題當(dāng)派生類(lèi)從多個(gè)基類(lèi)派生,而這些基類(lèi)又從同一個(gè)基類(lèi)派生,則在訪問(wèn)此共同基類(lèi)中的成員時(shí),將產(chǎn)生二義性——采用虛基類(lèi)來(lái)解決。在多繼承時(shí),基類(lèi)與派生類(lèi)之間,或基類(lèi)之間出現(xiàn)同名成員時(shí),將出現(xiàn)訪問(wèn)時(shí)的二義性(不確定性)——采用虛函數(shù)(參見(jiàn)第8章)或同名隱藏來(lái)解決。487.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定二義性問(wèn)題舉例classA{public: voidf();};classB{public: voidf(); voidg()};classC:publicA,piblicB{public: voidg(); voidh();};如果定義:Cc1;則c1.f()具有二義性而c1.g()無(wú)二義性(同名隱藏)497.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定解決方法一:用類(lèi)名來(lái)限定

c1.A::f()或c1.B::f()解決方法二:同名隱藏

在C中聲明一個(gè)同名成員函數(shù)f(),f()再根據(jù)需要調(diào)用A::f()或B::f()例7-7多繼承同名隱藏舉例//7_7.cpp#include<iostream>usingnamespacestd;classBase0{ //定義基類(lèi)Base0public: intvar0; voidfun0(){cout<<"MemberofBase0"<<endl;}};classBase1:publicBase0{ //定義派生類(lèi)Base1public: //新增外部接口

intvar1;};classBase2:publicBase0{ //定義派生類(lèi)Base2public: //新增外部接口

intvar2;};507.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定例7-7(續(xù))classDerived:publicBase1,publicBase2{//定義派生類(lèi)Derivedpublic: //新增外部接口

intvar; voidfun(){cout<<"MemberofDerived"<<endl;}};

intmain(){ //程序主函數(shù)

Derivedd; //定義Derived類(lèi)對(duì)象d d.Base1::var0=2; //使用直接基類(lèi)

d.Base1::fun0(); d.Base2::var0=3; //使用直接基類(lèi)

d.Base2::fun0(); return0;}517.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定派生類(lèi)C的對(duì)象的存儲(chǔ)結(jié)構(gòu)示意圖:var0var1var0var2varBase0類(lèi)成員Base0類(lèi)成員Base1類(lèi)成員Base2類(lèi)成員Derived類(lèi)對(duì)象有二義性:Derivedd;d.var0d.Base0::var0無(wú)二義性:d.Base1::var0d.Base2::var0527.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.1作用域限定Base1Base2DerivedBase0問(wèn)題:冗余以及因冗余而導(dǎo)致的不一致性7.5.2虛基類(lèi)虛基類(lèi)的引入用于有共同基類(lèi)的場(chǎng)合聲明以virtual修飾說(shuō)明基類(lèi)

例:classB1:virtualpublicB作用主要用來(lái)解決多繼承時(shí)可能發(fā)生的對(duì)同一基類(lèi)繼承多次而產(chǎn)生的二義性問(wèn)題.為最遠(yuǎn)的派生類(lèi)提供唯一的基類(lèi)成員,而不重復(fù)產(chǎn)生多次拷貝注意:在第一級(jí)繼承時(shí)就要將共同基類(lèi)設(shè)計(jì)為虛基類(lèi)。537.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)54例7-8虛基類(lèi)舉例7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.2虛基類(lèi)DerivedBase0::var0:intBase1::var1:intBase2::var2:intvar:intBase0::fun0():voidfun():voidBase1+var1:intBase2+var2:intDerived+var:int+fun():void<<virtual>>Base0+var0:int+fun0():void55例7-8(續(xù))#include<iostream>usingnamespacestd;classBase0{ //定義基類(lèi)Base0public: intvar0; voidfun0(){cout<<"MemberofBase0"<<endl;}};classBase1:virtualpublicBase0{ //定義派生類(lèi)Base1public: //新增外部接口

intvar1;};classBase2:virtualpublicBase0{ //定義派生類(lèi)Base2public: //新增外部接口

intvar2;};7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.2虛基類(lèi)56例7-8(續(xù))classDerived:publicBase1,publicBase2{//定義派生類(lèi)Derivedpublic: //新增外部接口

intvar; voidfun(){ cout<<"MemberofDerived"<<endl; }};intmain(){ //程序主函數(shù)

Derivedd; //定義Derived類(lèi)對(duì)象d d.var0=2;//直接訪問(wèn)虛基類(lèi)的數(shù)據(jù)成員

d.fun0(); //直接訪問(wèn)虛基類(lèi)的函數(shù)成員

return0;}7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.2虛基類(lèi)7.5.3虛基類(lèi)及其派生類(lèi)構(gòu)造函數(shù)建立對(duì)象時(shí)所指定的類(lèi)稱(chēng)為最(遠(yuǎn))派生類(lèi)。虛基類(lèi)的成員是由最派生類(lèi)的構(gòu)造函數(shù)通過(guò)調(diào)用虛基類(lèi)的構(gòu)造函數(shù)進(jìn)行初始化的。在整個(gè)繼承結(jié)構(gòu)中,直接或間接繼承虛基類(lèi)的所有派生類(lèi),都必須在構(gòu)造函數(shù)的成員初始化表中給出對(duì)虛基類(lèi)的構(gòu)造函數(shù)的調(diào)用。如果未列出,則表示調(diào)用該虛基類(lèi)的默認(rèn)構(gòu)造函數(shù)。在建立對(duì)象時(shí),只有最派生類(lèi)的構(gòu)造函數(shù)調(diào)用虛基類(lèi)的構(gòu)造函數(shù),該派生類(lèi)的其他基類(lèi)對(duì)虛基類(lèi)構(gòu)造函數(shù)的調(diào)用被忽略。577.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)58有虛基類(lèi)時(shí)的構(gòu)造函數(shù)舉例#include<iostream>usingnamespacestd;classBase0{ //定義基類(lèi)Base0public: Base0(intvar):var0(var){} intvar0; voidfun0(){cout<<"MemberofBase0"<<endl;}};classBase1:virtualpublicBase0{ //定義派生類(lèi)Base1public: //新增外部接口

Base1(intvar):Base0(var){} intvar1;};classBase2:virtualpublicBase0{ //定義派生類(lèi)Base2public: //新增外部接口

Base2(intvar):Base0(var){} intvar2;};7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.3虛基類(lèi)及其派生類(lèi)構(gòu)造函數(shù)59有虛基類(lèi)時(shí)的構(gòu)造函數(shù)舉例(續(xù))classDerived:publicBase1,publicBase2{ //定義派生類(lèi)Derivedpublic: //新增外部接口

Derived(intvar):Base0(var),Base1(var),Base2(var){} intvar; voidfun(){cout<<"MemberofDerived"<<endl;}};intmain(){ //程序主函數(shù)

Derivedd(1); //定義Derived類(lèi)對(duì)象d d.var0=2; //直接訪問(wèn)虛基類(lèi)的數(shù)據(jù)成員

d.fun0(); //直接訪問(wèn)虛基類(lèi)的函數(shù)成員

return0;}7.5派生類(lèi)成員的標(biāo)識(shí)與訪問(wèn)——7.5.3虛基類(lèi)及其派生類(lèi)構(gòu)造函數(shù)7.6程序?qū)嵗酶咚瓜シń饩€性方程組607.6程序?qū)嵗酶咚瓜シń饩€性方程組算法原理求解Ax=b經(jīng)過(guò)推算得到計(jì)算公式:617.6.1算法基本原理

7.6.2程序設(shè)計(jì)分析627.6程序?qū)嵗酶咚瓜シń饩€性方程組LinearEqu-sums:double*-solution:double*+LinearEqu(dims:int=2)+~LinearEqu()+setLinearEqu(a:constdouble*,b:double*):void<<const>>+printLinearEqu():void+solve():bool<<const>>+printSolution():voidMatrix-size:int-elements:double*+Matrix(size:int=2)+~Matrix()+setMatrix(values:constdouble*):void<<const>>+printMatrix():void<<const>>+getSize():int+element(i:int,j:int):double&<<const>>+element(i:int,j:int):double7.6.3源程序及說(shuō)明例7-9全選主元高斯消去法解線性方程組整個(gè)程序分為三個(gè)獨(dú)立的文檔,LinearEqu.h文件中包括矩陣類(lèi)Matrix和線性方程組類(lèi)LinearEqu的定義,LinearEqu.cpp文件中包括這兩個(gè)類(lèi)的成員函數(shù)實(shí)現(xiàn)文件;lequmain.cpp文件包括程序的主函數(shù),主函數(shù)中定義了一個(gè)類(lèi)LinearEqu的對(duì)象,通過(guò)這個(gè)對(duì)象求解一個(gè)四元線性方程組。637.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明//Matrix.h文件一,Matrix類(lèi)定義#ifndef_MATRIX_H#define_MATRIX_HclassMatrix{ //基類(lèi)Matrix定義public: //外部接口

Matrix(intsize=2); //構(gòu)造函數(shù)

~Matrix(); //析構(gòu)函數(shù)

voidsetMatrix(constdouble*values);//矩陣賦初值

voidprintMatrix()const; //顯示矩陣

intgetSize()const{returnsize;} //得到矩陣大小

double&element(inti,intj){returnelements[i*size+j];} doubleelement(inti,intj)const{returnelements[i*size+j];}private: //保護(hù)數(shù)據(jù)成員

intsize; //矩陣的大小

double*elements; //矩陣存放數(shù)組首地址};#endif//_MATRIX_H64例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明//LinearEqu.h文件二,LinearEqu類(lèi)定義#ifndef_LINEAR_EQU_H#define_LINEAR_EQU_H#include"Matrix.h"classLinearEqu:publicMatrix{ //公有派生類(lèi)LinearEqu定義public: //外部接口

LinearEqu(intsize=2); //構(gòu)造函數(shù)

~LinearEqu(); //析構(gòu)函數(shù) //方程賦值

voidsetLinearEqu(constdouble*a,constdouble*b);

boolsolve(); //全選主元高斯消去法求解方程

voidprintLinearEqu()const; //顯示方程

voidprintSolution()const; //顯示方程的解private: //私有數(shù)據(jù)

double*sums; //方程右端項(xiàng)

double*solution; //方程的解};#endif//_LINEAREQU_H65例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明//Matrix.cpp文件三,Matrix類(lèi)實(shí)現(xiàn)#include"Matrix.h"http://包含類(lèi)的定義頭文件#include<iostream>usingnamespacestd;voidMatrix::setMatrix(constdouble*values){//設(shè)置矩陣

for(inti=0;i<size*size;i++) elements[i]=values[i]; //矩陣成員賦初值}//矩陣Matrix類(lèi)的構(gòu)造函數(shù)Matrix::Matrix(intsize/*=2*/):size(size){

elements=newdouble[size*size]; //動(dòng)態(tài)內(nèi)存分配}Matrix::~Matrix(){ //矩陣Matrix類(lèi)的析構(gòu)函數(shù)

delete[]elements; //內(nèi)存釋放}voidMatrix::printMatrix()const{//顯示矩陣的元素

cout<<"TheMatrixis:"<<endl; for(inti=0;i<size;i++){ for(intj=0;j<size;j++) cout<<element(i,j)<<""; cout<<endl; }}66例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明//LinearEqu.cpp文件四,LinearEqu類(lèi)實(shí)現(xiàn)#include"LinearEqu.h" //包含類(lèi)的定義頭文件#include<iostream>#include<cmath>usingnamespacestd;LinearEqu::LinearEqu(intsize/*=2*/):Matrix(size){ //用size調(diào)用基類(lèi)構(gòu)造函數(shù)

sums=newdouble[size]; //動(dòng)態(tài)內(nèi)存分配

solution=newdouble[size];}LinearEqu::~LinearEqu() {//派生類(lèi)LinearEqu的析構(gòu)函數(shù)

delete[]sums; //釋放內(nèi)存

delete[]solution; //會(huì)自動(dòng)調(diào)用基類(lèi)析構(gòu)函數(shù)}voidLinearEqu::setLinearEqu(constdouble*a,constdouble*b){ //設(shè)置線性方程組

setMatrix(a); //調(diào)用基類(lèi)函數(shù)

for(inti=0;i<getSize();i++) sums[i]=b[i];}67例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明voidLinearEqu::printLinearEqu()const{//顯示線性方程組

cout<<"TheLineequtionis:"<<endl; for(inti=0;i<getSize();i++){ for(intj=0;j<getSize();j++) cout<<element(i,j)<<""; cout<<""<<sums[i]<<endl; }}

voidLinearEqu::printSolution()const{//輸出方程的解

cout<<"TheResultis:"<<endl; for(inti=0;i<getSize();i++) cout<<"x["<<i<<"]="<<solution[i]<<endl;}

inlinevoidswap(double&v1,double&v2){//交換兩個(gè)實(shí)數(shù)

doubletemp=v1; v1=v2; v2=temp;}68例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明boolLinearEqu::solve(){ //全選主元素高斯消去法求解方程

int*js=newint[getSize()]; //存儲(chǔ)主元素所在列號(hào)的數(shù)組

for(intk=0;k<getSize()-1;k++) {//選主元素

intis; //主元素所在行號(hào)

doublemax=0; //所有元素的最大值

for(inti=k;i<getSize();i++) for(intj=k;j<getSize();j++){ doublet=fabs(element(i,j)); if(t>max){ max=t; js[k]=j; is=i; } } if(max==0){ delete[]js; returnfalse; }

69例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明 else{//通過(guò)行、列交換,把主元素交換到第k行第k列

if(js[k]!=k) for(inti=0;i<getSize();i++) swap(element(i,k),element(i,js[k])); if(is!=k){ for(intj=k;j<getSize();j++) swap(element(k,j),element(is,j)); swap(sums[k],sums[is]); } } //消去過(guò)程

doublemajor=element(k,k); for(intj=k+1;j<getSize();j++) element(k,j)/=major; sums[k]/=major; for(inti=k+1;i<getSize();i++){ for(intj=k+1;j<getSize();j++) element(i,j)-=element(i,k)*element(k,j); sums[i]-=element(i,k)*sums[k]; } }

70例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明 //判斷剩下的一個(gè)元素是否等于0 doubled=element(getSize()-1,getSize()-1); if(fabs(d)<1e-15){ delete[]js; returnfalse; } //回代過(guò)程

solution[getSize()-1]=sums[getSize()-1]/d; for(inti=getSize()-2;i>=0;i--){ doublet=0.0; for(intj=i+1;j<=getSize()-1;j++) t+=element(i,j)*solution[j]; solution[i]=sums[i]-t; } js[getSize()-1]=getSize()-1; for(intk=getSize()-1;k>=0;k--) if(js[k]!=k)swap(solution[k],solution[js[k]]); delete[]js; returntrue;}

71例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明//7_9.cpp文件五,主函數(shù)#include"LinearEqu.h" //類(lèi)定義頭文件#include<iostream>usingnamespacestd;

intmain(){ //主函數(shù)

doublea[]= {//方程系數(shù)矩陣

0.2368,0.2471,0.2568,1.2671, //第一行

0.1968,0.2071,1.2168,0.2271, //第二行

0.1581,1.1675,0.1768,0.1871, //第三行

1.1161,0.1254,0.1397,0.1490}; //第四行

doubleb[]={1.8471,1.7471,1.6471,1.5471};//方程右端項(xiàng)

LinearEquequ(4); //定義一個(gè)四元方程組對(duì)象

equ.setLinearEqu(a,b); //設(shè)置方程組

equ.printLinearEqu(); //輸出方程組

if(equ.solve()) //求解方程組

equ.printSolution(); //輸出方程組的解

else cout<<"Fail"<<endl; return0;} 72例7-9(續(xù))7.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明例7-9(續(xù))運(yùn)行結(jié)果為:TheLineequtionis: //方程組0.23680.24710.25681.26711.84710.19680.20711.21680.22711.74710.15811.16750.17680.18711.64711.11610.12540.13970.1491.5471TheResultis: //方程組的解X[0]=1.04058X[1]=0.987051X[2]=0.93504X[3]=0.881282737.6程序?qū)嵗酶咚瓜シń饩€性方程組——7.6.3源程序及說(shuō)明7.7.1問(wèn)題的提出使用繼承和派生往個(gè)人銀行賬戶(hù)管理程序中增加信用賬號(hào)平時(shí)沒(méi)有利息,透支時(shí)需要支付透支利息,且每個(gè)月結(jié)算一次747.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序757.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序——7.7.2類(lèi)設(shè)計(jì)- acc:Accumulator- rate:doubleSavingsAccount+ SavingsAccount(date:Date,id:int,rate:double)<<const>>+ getRate():double+ deposit(date:Date,amount:double,desc:string)+ withdraw(date:Date,amount:double,desc:string)+ settle(date:Date)11- acc:Accumulator- credit:double- rate:double- fee:doubleCreditAccount<<const>>- getDebt():double+ CreditAccount(date:Date,id:int,credit:double,rate:double,fee:double)<<const>>+ getCredit():double<<const>>+ getRate():double<<const>>+ getFee():double<<const>>+ getAvailableCredit():double+ deposit(date:Date,amount:double,desc:string)+ withdraw(date:Date,amount:double,desc:string)+ settle(date:Date)<<const>>+ show()- year:int- month:int- day:int- totalDays:int+ Date(year:int,month:int,day:int)<<const>>+ getYear():int<<const>>+ getMonth():int<<const>>+ getDay():int<<const>>+getMaxDay():int<<const>>+isLeapYear():bool<<const>>+show()<<const>>+distance(date:Date):intDate- lastDate:Date- value:double- sum:double+ Accumulator(date:Date,value:double)<<const>>+ getSum(date:Date):double+ change(date:Date,value:double)+ reset(date:Date,value:double)Accumulator# Account(date:Date,id:int)# record(date:Date,amount:double,desc:string)<<const>>#error(msg:string) <<const>>+ getId():int<<const>>+ getBalance():double<<const>>+ show()<<static>>+ getTotal():doubleAccount- id:string- balance:double- total:double17.7.3源程序及說(shuō)明例7-10個(gè)人銀行賬戶(hù)管理程序整個(gè)程序分為6個(gè)文件:date.h是日期類(lèi)頭文件,date.cpp是日期類(lèi)實(shí)現(xiàn)文件,accumulator.h為按日將數(shù)值累加的Accumulator類(lèi)的頭文件,account.h是各個(gè)儲(chǔ)蓄賬戶(hù)類(lèi)定義頭文件,account.cpp是各個(gè)儲(chǔ)蓄賬戶(hù)類(lèi)實(shí)現(xiàn)文件,7_10.cpp是主函數(shù)文件。重復(fù)的文件或內(nèi)容不再給出767.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序——7.7.3源程序及說(shuō)明//accumulator.h#ifndef__ACCUMULATOR_H__#define__ACCUMULATOR_H__#include"date.h"classAccumulator{ //將某個(gè)數(shù)值按日累加private: DatelastDate; //上次變更數(shù)值的時(shí)期

doublevalue; //數(shù)值的當(dāng)前值

doublesum; //數(shù)值按日累加之和public: //構(gòu)造函數(shù),date為開(kāi)始累加的日期,value為初始值

Accumulator(constDate&date,doublevalue) :lastDate(date),value(value),sum(0){} //獲得到日期date的累加結(jié)果

doublegetSum(constDate&date)const{ returnsum+value*date.distance(lastDate); } //在date將數(shù)值變更為value voidchange(constDate&date,doublevalue){ sum=getSum(date); lastDate=date;this->value=value; }777.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序——7.7.3源程序及說(shuō)明例7-10(續(xù))//accumulator.h#ifndef__ACCUMULATOR_H__#define__ACCUMULATOR_H__#include"date.h"classAccumulator{ //將某個(gè)數(shù)值按日累加private: DatelastDate; //上次變更數(shù)值的時(shí)期

doublevalue; //數(shù)值的當(dāng)前值

doublesum; //數(shù)值按日累加之和public: //構(gòu)造函數(shù),date為開(kāi)始累加的日期,value為初始值

Accumulator(constDate&date,doublevalue) :lastDate(date),value(value),sum(0){} //獲得到日期date的累加結(jié)果

doublegetSum(constDate&date)const{ returnsum+value*date.distance(lastDate); } //在date將數(shù)值變更為value voidchange(constDate&date,doublevalue){ sum=getSum(date); lastDate=date;this->value=value; }787.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序——7.7.3源程序及說(shuō)明例7-10(續(xù))//初始化,將日期變?yōu)閐ate,數(shù)值變?yōu)関alue,累加器清零

voidreset(constDate&date,doublevalue){ lastDate=date;this->value=value;sum=0; }};#endif//__ACCUMULATOR_H__//account.h#ifndef__ACCOUNT_H__#define__ACCOUNT_H__#include"date.h"#include"accumulator.h"#include<string>classAccount{//賬戶(hù)類(lèi)private: std::stringid; //帳號(hào)

doublebalance; //余額

staticdoubletotal;//所有賬戶(hù)的總金額protected: //供派生類(lèi)調(diào)用的構(gòu)造函數(shù),id為賬戶(hù)

Account(constDate&date,conststd::string&id);

797.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序——7.7.3源程序及說(shuō)明例7-10(續(xù))//記錄一筆帳,date為日期,amount為金額,desc為說(shuō)明

voidrecord(constDate&date,doubleamount,conststd::string&desc); //報(bào)告錯(cuò)誤信息

voiderror(conststd::string&msg)const;public: conststd::string&getId()const{returnid;} doublegetBalance()const{returnbalance;} staticdoublegetTotal(){returntotal;} //顯示賬戶(hù)信息

voidshow()const;};classSavingsAccount:publicAccount{//儲(chǔ)蓄賬戶(hù)類(lèi)private: Accumulatoracc; //輔助計(jì)算利息的累加器

doublerate; //存款的年利率public: //構(gòu)造函數(shù)

SavingsAccount(constDate&date,conststd::string&id,doublerate); doublegetRate()const{returnrate;}807.7綜合實(shí)例——個(gè)人銀行賬戶(hù)管理程序——7.7.3源程序及說(shuō)明例7-10(續(xù))

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論