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

来源:互联网 发布:ubuntu 标题栏消失 编辑:程序博客网 时间:2024/05/13 12:40
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必须有一个虚析构函数,即使该析构函数不执行任何操作。
0 0