C++的探索路15多态与虚函数之高级篇

Posted Guerrouj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的探索路15多态与虚函数之高级篇相关的知识,希望对你有一定的参考价值。

本部分是多态与虚函数主要内容的完结篇,这一部分将介绍虚析构函数以及纯虚函数和抽象类,结束本章后下一部分将为习题课的练习。

虚析构函数

为了担心说起来太抽象,先扔一个程序

#include<iostream>
using namespace std;
class CShape 
public:
	~CShape() 
		cout << "CShape::destructor" << endl;
	
;
class CRectangle :public CShape 
public:
	int w, h;
	~CRectangle() 
		cout << "CRectangle::destructor" << endl;
	
;

int main()

	CShape*p = new CRectangle;
	delete p;
    return 0;

该程序中共有两个类,CShape类以及CRectangle类,CRectangle类由CShape类派生而来;在主程序中new出一块CRectangle的空间并赋值给CShape指针,并随后通过delete回收内存。

这是打印结果

程序运行似乎正确,内心没有一点波澜,However, Too young , too simple~

我们new的是一个CRectangle的空间,虽然最终通过CShape进行了调用,但只回收了CShape的内存空间,还有一部分内存空间并没有收回!

这个时候的解决办法就是:给析构函数加上virtual关键字!

然后就可以愉快的玩耍了

此外,构造函数是不能成为虚构造函数的

在这里总结一下


纯虚函数以及抽象类

纯虚函数,听名字就很虚;也就是没有函数体的虚函数。包含纯虚函数的类称为抽象类,由于抽象类包含了一个这么虚的函数,因此是不能有这么一个独立的对象,比如

独立的抽象类的对象不存在,但是包含在派生类对象中的抽象类的对象是可以存在的。

如果一个类从抽象类派生而来,那么当且仅当他对基类中的所有纯虚函数都进行覆盖,并写了函数体,它才能成为非抽象类





以上是关于C++的探索路15多态与虚函数之高级篇的主要内容,如果未能解决你的问题,请参考以下文章

C++的探索路14多态与虚函数之基础篇

C++之多态性与虚函数

C++的探索路12继承与派生之高级篇--派生类与赋值运算符及多重继承

C++多态性与虚函数

C++程序设计POJ》《WEEK6 多态与虚函数》

C++的探索路13继承与派生之练习篇(需重新学习)