虚函数初探

/*=================================================================================
什么是多态?
	多态就是指(通过父类指针调用子类对象)	相同的对象收到不同的消息	或	不同的对象收到相同的消息
										产生不同的动作

				1、静态多态(早绑定)		
				Class Rect
				{
				public:
					int calcArea(int width);
					int calcArew(int width,int height);
				};
				Rect a(1),b(1,2);//编译阶段已经知道了调用哪个构造函数

				2、动态多态
				计算面积		计算圆形面积		计算矩形面积
				相同的命令不同的动作(计算面积的方法不一样)	多态必须以继承和封装为基础
				//图形类
				class Shape       
				{
				public:
					double calcArea()
					{
						cout<<"calcArea"<<endl;
					};
				};
				//圆类
				class Circle:public Shape
				{
				public:
					Circle(double r);
					double calcArea();
				private:
					double m_dR;
				};
				//矩形类
				class Rect:public Shape
				{
				public:
					Rect(double width,double height);
					double calcArea();
				private:
					double widrh;
					double height;
				};

				int main()
				{
					Shape *shape1=new Circle(4.0);
					Shape *shape1=new Rect(3.0,5.0);
					shape->calcArea();
					shape->calcArea();
				}
				父函数calcArea不加virtual,则执行父函数的calcArea函数
				父函数加上virtual修饰,子类调用会调用自身定义的calcArea函数(系统默认virtual修饰)
/*==================================================================================*/
#include <iostream>
using namespace std;
class Shape
{
public:
	virtual double calcArea()
	{
		cout << "calcArea" << endl;
		return 0;
	};
};
//圆类
class Circle :public Shape
{
public:
	Circle(double r)
	{
		m_dR = r;
	}
	virtual double calcArea()
	{
		return m_dR*m_dR*3.14;
	}
private:
	double m_dR;
};
//矩形类
class Rect :public Shape
{
public:
	Rect(double width, double height)
	{
		this->height = height;
		this->widrh = width;
	}
	virtual double calcArea()
	{
		return widrh*height;
	}
private:
	double widrh;
	double height;
};

int main()
{
	Shape *shape1 = new Circle(4.0);
	Shape *shape2 = new Rect(3.0, 5.0);
	cout << shape1->calcArea()<<endl;	//calcArea
	cout << shape2->calcArea()<<endl; //calcArea
	delete shape1;//只能执行父类的析构函数 子类内存泄漏
	delete shape2;//只能执行父类的析构函数 子类内存泄漏
	shape1 = NULL;
	shape2 = NULL;
}
/*===============================================================================================
内存泄漏!!!
解决delete父类指针只执行父类析构函数的问题:
	用虚析构函数
		virtual ~Shape();
		这样子类的析构函数是默认的 virtual ~Circle()
								 virtual ~Rect()
=================================================================================================/
注意点:
	1、virtual不能修饰普通函数
	2、virtual不能修饰静态成员函数
		静态成员函数与类是一起同生共死的 不属于某一个对象
	3、virtal不能修饰内联函数   如果修饰内联函数 将失去内联函数的作用直接变成一个虚函数
	4、virtual不能修饰构造函数 会出现编译错误
=================================================================================================*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值