天天看点

基类为何需要有一个虚析构函数

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 m1 = 500,double r = 0.11125);
	BrassPlus(const Brass &ba,double m1 = 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;}
};
           

        为何基类包含了一个虚析构函数,虽然有时好像并不需要析构函数,如果析构函数不是虚的,则将只有调用对应于指针类型的析构函数,对于此程序,只有Brass的析构函数被调用,即使指针指向的是一个BrassPlus对象。如果析构函数是虚的,将调用相应对象的析构函数,因此,如果指针指向的是BrassPlus对象,将调用BrassPlus的析构函数,然后自动调用基类的析构函数,因此,使用虚析构函数可以确保正确的析构序列被调用,虽然此程序对于这种虚析构函数并不是很重要,因为析构函数没有执行任何操作,然而,如果BrassPlus包含一个执行某些操作的析构函数,则Brass必须有一个虚析构函数,即使该析构函数不执行任何操作。

继续阅读