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() {}
};
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);
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; }
};
若有以下代码
BrassPlus ophelia;
Brass* bp;
bp = &ophelia;
ph->ViewAcct();
如果在基类中没有将ViewAcct()声明为虚函数,则bp->ViewAcct()将根据指针类型Brass* 调用 Brass::ViewAcct(),编译器对非虚函数使用静态联编。
然而,如果在基类中将ViewAcct()声明为虚函数,则bp->ViewAcct()将根据对象类型BrassPlus 调用 Brass::ViewAcct(),编译器对非虚函数使用动态联编。