我们在多态公有继承时,我们常常用到虚方法,在成员函数前面加virtual的函数,被称为虚函数。我们在派生类种定义基类的方法,当我们派生类对象也想用这个方法名称。这个时候,如果用虚函数,程序将对对象类型而不是引用或指针的类型来选择方法版本。
class Brass
{
private:
std::string fullName;
long acctNum;
double balance;
public:
Brass(const std::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() {}
};
//Brass Plus Account Class
class BrassPlus : public Brass
{
private:
double maxLoan;
double rate;
double owesBank;
public:
BrassPlus(const std::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);
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; }
};
其中的withdraw和ViewAcct都是虚函数,包括析构函数。当我们用Brass定义一个对象dom,用派生类对象定义一个对象dot
Brass dom("Dominc Banker",11224,413);
BrassPlus dot("Dominc Tanker",11211,429);
Brass &b1_ref=dom;
Brass &b2_ref=dot;
b1_ref.ViewAcct();//这里用的基类的ViewAcct
b2_ref.ViewAcct();//这里用的派生类的ViewAcct
如果不加virtual,那么b2_ref.ViewAcct()用的还是基类的方法,因为程序是根据引用类型和指针类型选择方法。
虚函数满足多态的问题,就是我们要同时管理基类和派生类对象,我们定义一个指向基类的指针数组,但是这些指针在赋值的时候,包含指向基类对象的指针和指向派生类对象的指针。这样达到多态管理的目的。
构造函数不能是虚函数,析构函数应该是虚函数,友元函数不能是虚函数。