`
xitong
  • 浏览: 6188946 次
文章分类
社区版块
存档分类
最新评论

C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数

 
阅读更多

先来看一段代码:

//test.cpp
#include <iostream>
using namespace std;

class father
{
public:
	father()
	{
		mPtr = new int;
	}

	~father()
	{
		delete mPtr;
		cout << "father Destruction......" << endl;
	}

private:
	int *mPtr;
};


class son:public father
{
public:
	son()
	{
		mStr = new long;
	}

	~son()
	{
		delete mStr;
		cout << "son Destruction......" << endl;
	}

private:
	long *mStr;
};


int main()
{
	father *p = new son;
	delete p;
	return 0;
}


程序运行截图:

从程序的运行结果来看,程序最后只释放了父类的内存,子类的内存并没有释放。则这段程序产生了内存泄露。那是什么原因导致的呢?

main函数中new出来的是子类son的对象,采用一个父类father的指针来接收,故在析构的时候,编译器因为只知道这个指针是父类的,所以只将父类部分的内存析构了,而不会去析构子类的内存,就造成了内存泄露,那么如何避免这种情况的产生呢?

将父类的析构函数改为虚函数,就可以避免这种情况。

//test.cpp
#include <iostream>
using namespace std;

class father
{
public:
	father()
	{
		mPtr = new int;
	}

	virtual~father()
	{
		delete mPtr;
		cout << "father Destruction......" << endl;
	}

private:
	int *mPtr;
};


class son:public father
{
public:
	son()
	{
		mStr = new long;
	}

	~son()
	{
		delete mStr;
		cout << "son Destruction......" << endl;
	}

private:
	long *mStr;
};


int main()
{
	father *p = new son;
	delete p;
	return 0;
}


程序运行截图:

从程序的运行结果可以看出,父类和子类的内存都被析构了。所以在使用多态时一定要将父类的析构函数定义成虚函数,从而避免内存泄露。

分享到:
评论

相关推荐

    浅谈C++基类的析构函数为虚函数

     在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类。 2、例子:  (1)、    #include  using namespace std;  class Base{  public: Base() {};  ~Base() {cout &lt;&...

    C++大学教程

    C++大学教程(目录) ... 3.5 函数定义--------------------------------------------------------105 3.6 函数原型--------------------------------------------------------108 3.7 头文件------...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题10:编写类String 的构造函数、析构函数和赋值函数 8.4 拷贝构造函数 面试题11:谈谈对拷贝构造函数和赋值运算符的认识 面试题12:写出当定义#define _INMAIN 0和不定义时代码打印结果 第9章 继承与多态 9.1 ...

    C++实验1-13,包含完整程序、注释、报告

    实验5-构造函数与析构函数的编程 实验6-利用静态成员编程 实验7-利用友元编程 实验8-继承和派生的编程 实验9-利用多态编程 实验10-运算符重载编程 实验11- 利用模板编程 实验12-利用文件编程 实验13- 面向对象综合...

    清华大学计算机课程之《C++程序设计》

    - 第四节 虚析构函数 - 第五节 设计继承 - 第六节 程序举例 - 本章小结 - 课后习题 ◇ 第十二章 输入输出流 - 课前索引 - 第一节 输入输出流类 - 第二节 文件流 - 第三节 字节流类 - 第四节 流错误处理 ...

    C++入门指南-v2.4.pdf

    4.6 基类和派生类的析构函数 83 4.7 多继承 85 4.8 虚继承和虚基类 88 五、C++多态与抽象类 91 5.1 多态概念介绍 91 5.2 虚函数 92 5.3 纯虚函数和抽象类 95 六、C++运算符重载 97 6.1 运算符重载语法介绍 97 6.2 可...

    c++ 面试题 总结

    1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类...

    【全新正版】现代C++程序设计(原书第2版)

    8.4.4 基类和派生类的析构函数 8.4.5 医生也是人 8.4.6 关于派生类和基类构造函数的规则 8.5 多态和虚函数 8.5.1 多态——同一个接口,不同的行为 8.5.2 什么是虚函数 8.5.3 虚函数的作用 8.6 总结 8.7 练习 复习题 ...

    C++上机实验报告-实验六.docx

    析构函数 Point(){} Point(int,int); ~Point(){} //++.--重载 Point& operator ++(); Point operator ++(int); Point& operator --(); Point operator --(int); //输出点坐标 void showPoint(); }; Point::Point(int...

    现代C++程序设计

    8.4.4 基类和派生类的析构函数 8.4.5 医生也是人 8.4.6 关于派生类和基类构造函数的规则 8.5 多态和虚函数 8.5.1 多态——同一个接口,不同的行为 8.5.2 什么是虚函数 8.5.3 虚函数的作用 8.6 总结 8.7 练习 复习题...

    C++中虚函数和纯虚函数定义

    只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。所以虚函数只能用于类的继承层次结构中。  一个成员函数被声明为...

    C++编程思想习题

    14.9析构函数和虚拟析构函数 14.10小结 14.11练习 第15章 模板和包容器类 15.1包容器和循环子 15.2模板综述 15.2.1C方法 15.2.2Smalltalk方法 15.2.3模板方法 15.3模板的语法 15.3.1非内联函数定义 15.3.2栈模板...

    C++实验报告.doc

    为了方便,把代码放在Word里面了,每次上机实验的题目代码都在。...(4)为我公司建立一个多态的产品类层次结构,使用抽象类,测试时,创建一个基类指针的容器,通过基类指针调用虚函数,体验多态。

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之四十(继承与派生:派生类的析构函数) 鸡啄米:C++编程入门系列之四十一(继承与派生:作用域分辨符) 鸡啄米:C++编程入门系列之四十二(继承与派生:虚基类及其派生类 的构造函数)...

    Effective C++ 中文版

    条款07:为多态基类声明Virtual析构函数 条款08:别让异常逃离析构函数 条款09:绝不在构造和析构过程中调用Virtual函数 条款10:令Operator=返回一个referenceto this 条款11:在Operator=中处理“自我赋值” ...

    Visual C++开发经验技巧宝典(第1章)

    0054 基类的析构函数应该是虚方法 20 0055 访问限定符分析 21 0056 访问其他类的私有成员函数 21 0057 如何定义友员类 22 1.7 多态 23 0058 纯虚函数的使用 23 0059 覆盖基类的成员函数 23 0060 如何...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    14.2.2 派生类的析构函数 426 14.2.3 保护继承和私有继承 436 14.2.4 多继承 437 第15章 多态与虚函数 442 15.1 虚函数基础 442 15.1.1 后绑定 442 15.1.2 C++中的虚函数 443 15.1.3 抽象类和纯虚函数 448 ...

    摩托罗拉C++面试题

    子类继承父类大部分的资源,不能继承的有构造函数,析构函数,拷贝构造函数,operator=函数,友元函数等等 15.为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果。 16.介绍一下模板和容器。如何...

    Effective C++(第三版)

    条款07:为多态基类声明virtual析构函数 declare destructors virtual in polymorphic base classes. 条款08:别让异常逃离析构函数 prevent exceptions from leaving destructors. 条款09:绝不在构造和析构过程中...

Global site tag (gtag.js) - Google Analytics