目录
多态公有继承
有两种重要的机制可用于实现多态公有继承
- 在派生类中重新定义基类的方法
- 使用虚方法
#ifndef __TEST_2_H_
#define __TEST_2_H_
#include <iostream>
#include<string>
using namespace std;
typedef unsigned int uint;
class Brass
{
private:
string fullname;
long acctNum;
double balance;
public:
Brass(const string & 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(){}
};
class BrassPlus : public Brass
{
private:
double maxLoan;
double rate;
double owesBank;
public:
BrassPlus(const string & s = "Nullbody",long an = -1,
double bal = 0.0,double ml = 500,double r = 0.11125);
BrassPlus(const Brass & ba,double ml = 500,double r = 0.11125);
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类和BrassPlus类都声明了ViewAcct()和Withdraw()方法,但它们的这些方法的行为是不同的
- 使用关键词virtual声明虚函数
#include"test_2.h"
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)
{
fullname = s;
acctNum = an;
balance = bal;
}
void Brass::Deposit(double amt)
{
if(amt < 0)
cout << "Negative deposit not allowed; "
<< "deposit is cancelled\n";
else
balance += amt;
}
void Brass::Withdraw(double amt)
{
format initialState = setFormat();
precis prec = cout.precision(2);
if(amt < 0)
cout << "in withdraw\n";
else if(amt <= balance)
balance -= amt;
else
cout << "amt = " << amt << "\n";
restore(initialState,prec);
}
double Brass::Balance()const
{
return balance;
}
void Brass::ViewAcct()const
{
format initialState = setFormat();
precis prec = cout.precision(2);
cout << "fullname = " << fullname << "\n";
cout << "balance = " << balance << "\n";
restore(initialState,prec);
}
BrassPlus::BrassPlus(const string & 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;
}
void BrassPlus::ViewAcct()const
{
format initialState = setFormat();
precis prec = cout.precision(2);
Brass::ViewAcct();
cout << "maxLoan = " << maxLoan << "\n";
cout << "owesBank = " << owesBank << "\n";
cout.precision(3);
restore(initialState,prec);
}
void BrassPlus::Withdraw(double amt)
{
format initialState = setFormat();
precis prec = cout.precision(2);
double bal = Balance();
if(amt <= bal)
Brass::Withdraw(amt);
else
cout << "quit withdraw\n";
restore(initialState,prec);
}
format setFormat()
{
return cout.setf(std::ios_base::fixed,std::ios_base::floatfield);
}
void restore(format f,precis p)
{
cout.setf(f,std::ios_base::floatfield);
cout.precision(p);
}
#include "test_2.h"
int main()
{
Brass Piggy("Porcelot Piggy",381299,4000.00);
BrassPlus Hoggy("Horatio Hogg",382288,3000.00);
Piggy.ViewAcct();
Hoggy.ViewAcct();
return 0;
}