/*=================================================================================
什么是多态?
多态就是指(通过父类指针调用子类对象) 相同的对象收到不同的消息 或 不同的对象收到相同的消息
产生不同的动作
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不能修饰构造函数 会出现编译错误
=================================================================================================*/
虚函数初探
最新推荐文章于 2021-09-18 15:53:02 发布