继承
类型
公有继承
派生类也是一个基类对象,可以对基类对象执行任何操作,也可以对派生类对象执行
保护继承
私有继承
多态
多态仅有继承
使用虚方法:在派生类中重新定义多态基类的方法
为基类声明一个虚拟析构函数
eg
在基类方法中场景中使用virtual的相关方法,在所有的派生类中都是虚拟的
如果使用指向对象的引用或指针来调用虚方法,程序将使用为对象类型定义的方法,而不使用为引用或者指针类型定义的方法。仅与对象类型有关
如果定义的类将被用作基类,则应将派生类中重新定义的方法声明为虚拟的
Note
如果在要派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法
类型
公有继承
派生类也是一个基类对象,可以对基类对象执行任何操作,也可以对派生类对象执行
保护继承
私有继承
多态
多态仅有继承
使用虚方法:在派生类中重新定义多态基类的方法
为基类声明一个虚拟析构函数
eg
brass.h
#ifndef BRASS_H_ #define BRASS_H_ class Brass { private: enum{MAX = 35}; 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 虚方法 virtual void Withdraw(double amt); double Balance()const; virtual void ViewAcct()const; virtual ~Brass(); }; class BrassPlus:public Brass { private: double maxLoan; double rate; double owesBank; public: BrassPlus(const char *s = "NullBody",long an = -1,double bal = 0.0,double ml = 500,double r = 0.10); BrassPlus(const Brass & ba,double ml = 500,double r = 0.1); virtual void ViewAcct()const; virtual void Withdraw(double amt); void ResetMax(double m){maxLoan = m;} void ResetRate(double r){rate = r;} void ResetOwes(){owesBank = 0;} }; #endif
brass.cpp
#include <iostream> #include <cstring> #include "brass.h" using std::cout; using std::ios_base; using std::endl; Brass::Brass(const char *s,long an,double bal) { std::strncpy(fullName,s,MAX-1); fullName[MAX-1] = '\0'; acctNum = an; balance = bal; } void Brass::Deposit(double amt) { if(amt < 0) cout<<"Negative deposit not allowed:"<<" deposit is cancelled.\n"; else balance +=amt; } Brass::~Brass() { } //define Withdraw() void Brass::Withdraw(double amt) { if(amt < 0) cout<<"Withdrawal amout must be positive:"<<" withdrawal canceled.\n"; else if(amt <= balance) balance -= amt; else cout<<"Withdrawal amout of {1}quot;<<amt<<" exceeds your balance.\n"<<"Withdrawal canceled.\n"; } double Brass::Balance()const { return balance; } void Brass::ViewAcct()const { //set up ###.## ios_base::fmtflags inititalState = cout.setf(ios_base::fixed,ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); cout<<"Client: "<<fullName<<endl; cout<<"Account Number: "<<acctNum<<endl; cout<<"Balance:{1}quot;<<balance<<endl; cout.setf(inititalState); } //BrassPlus method BrassPlus::BrassPlus(const char *s,long an,double bal,double ml,double r):Brass(s,an,bal) { maxLoan = ml; owesBank = 0.0; rate = r; } BrassPlus::BrassPlus(const Brass &ba,double ml,double r):Brass(ba) { maxLoan = ml; owesBank = 0.0; rate = r; } //redefine how ViewAcct() work void BrassPlus::ViewAcct()const { //set up ###.## ios_base::fmtflags inititalState = cout.setf(ios_base::fixed,ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); Brass::ViewAcct(); //display Brass::ViewAcct() cout<<"Maximum loan:{1}quot;<<maxLoan<<endl; cout<<"Owed to bank:{1}quot;<<owesBank<<endl; cout<<"Loan Rate:"<<100*rate<<"%"<<endl; cout.setf(inititalState); } //redefine how WithDraw() void BrassPlus::Withdraw(double amt) { //set up ###.## ios_base::fmtflags inititalState = cout.setf(ios_base::fixed,ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); double bal = Balance(); if(amt <= bal) Brass::Withdraw(amt); else if(amt <= bal+maxLoan-owesBank) { double advance = amt - bal; owesBank +=advance*(1.0 + rate); cout<<"Bank advance:{1}quot;<<advance<<endl; cout<<"Finance charge:{1}quot;<<advance*rate<<endl; Deposit(advance); Brass::Withdraw(amt); } else cout<<"Credit limit exceeded.Transaction cancelled.\n"; cout.setf(inititalState); }
usebrass2.cpp
虚函数
#include <iostream> #include "brass.h" const int CLIENTS = 4; const int LEN = 40; int main() { using std::cin; using std::cout; using std::endl; //指针表达Brass与BrassPlus Brass * p_clients[CLIENTS]; int i; for(i = 0;i<CLIENTS;i++) { char temp[LEN]; long tempnum; double tempbal; char kind; cout<<"Enter client's name:"; cin.getline(temp,LEN); cout<<"Enter client's account number:"; cin>>tempnum; cout<<"Enter opening balance:{1}quot;; cin>>tempbal; cout<<"Enter 1 for Brass Account or 2 for BrassPlus Account: "; while(cin>>kind && (kind!='1' && kind != '2')) cout<<"Enter either 1 or 2"; if(kind == '1') //p_clients构造Brass类对象 p_clients[i] = new Brass(temp,tempnum,tempbal); else { double tmax,trate; cout<<"Enter the interest rate as a decimal fraction: "; cin>>trate; //p_client构造BrassPlus类对象 p_clients[i] = new BrassPlus(temp,tempnum,tempbal,tmax,trate); } while(cin.get()!='\n') continue; } cout<<endl; for(i=0;i<CLIENTS;i++) { p_clients[i]->ViewAcct(); cout<<endl; } for(i = 0;i<CLIENTS;i++) { delete p_clients[i]; } cout<<"Done!\n"; system("pause"); return 0; }
在基类方法中场景中使用virtual的相关方法,在所有的派生类中都是虚拟的
如果使用指向对象的引用或指针来调用虚方法,程序将使用为对象类型定义的方法,而不使用为引用或者指针类型定义的方法。仅与对象类型有关
如果定义的类将被用作基类,则应将派生类中重新定义的方法声明为虚拟的
Note
如果在要派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法
603

被折叠的 条评论
为什么被折叠?



