基类为何需要有一个虚析构函数
2014-04-16 18:03
197 查看
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必须有一个虚析构函数,即使该析构函数不执行任何操作。
相关文章推荐
- 为何在一个类中定义了带参数的构造方法的时候,需要把无参构造方法定义一下
- 11周1--2以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试;
- 通过View.post()获取View的宽高引发的两个问题:1post的Runnable何时被执行,2为何View需要layout两次;以及发现Android的一个小bug
- 一个类做为基类时,如果有析构函数,则析构函数必须是虚析构函数
- C++ 虚析构函数-(一个带有虚函数功能的类,则它需要一个虚析构函数)
- 为何需要虚析构函数
- 我们为何需要一个“全球性社区”?
- 为多态基类声明一个虚析构函数(Effective C++_7)
- 以Point为基类,派生出一个Circle(圆)类,增加数据成员r(半径),以及求面积的成员函数area,实现其他需要的成员函数,设计main函数完成测试
- 通过View.post()获取View的宽高引发的两个问题:1post的Runnable何时被执行,2为何View需要layout两次;以及发现Android的一个小bug
- 类需要一个虚析构函数吗?
- 再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高),,以及求圆柱表面积的成员函数area和求圆柱体积的成员函数volume,实现需要的成员函数,并设计main
- c++基类不为虚析构函数的一个风险
- 一个监听TextView是否需要折叠的自定义的类
- 使用synchronized需要注意的一个问题
- 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束
- 一个通用的Java分页基类代码详解
- 每次看到某个数据结构的时候,有两个指针,一个起始,一个结束,一直没想明白为何是起始与结束,不是起始加数量,是怎么操作的?
- JVM 新生代为何需要两个 Survivor 空间?
- 关于后台返回数据为一个整体,我们需要拿某一个字段出来单独以这个字段进行分类的需求