虚函数初探

来源:互联网 发布:吴三桂 知乎 编辑:程序博客网 时间:2024/06/06 01:21
/*=================================================================================什么是多态?多态就是指(通过父类指针调用子类对象)相同的对象收到不同的消息或不同的对象收到相同的消息产生不同的动作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;//calcAreacout << shape2->calcArea()<<endl; //calcAreadelete shape1;//只能执行父类的析构函数 子类内存泄漏delete shape2;//只能执行父类的析构函数 子类内存泄漏shape1 = NULL;shape2 = NULL;}/*===============================================================================================内存泄漏!!!解决delete父类指针只执行父类析构函数的问题:用虚析构函数virtual ~Shape();这样子类的析构函数是默认的 virtual ~Circle() virtual ~Rect()=================================================================================================/注意点:1、virtual不能修饰普通函数2、virtual不能修饰静态成员函数静态成员函数与类是一起同生共死的 不属于某一个对象3、virtal不能修饰内联函数   如果修饰内联函数 将失去内联函数的作用直接变成一个虚函数4、virtual不能修饰构造函数 会出现编译错误=================================================================================================*/

0 0
原创粉丝点击