VS2010 C++ 学习笔记(七)virtual 虚函数

来源:互联网 发布:fft算法c语言 编辑:程序博客网 时间:2024/06/04 17:43


virtual 虚函数


demo.cpp

#include <iostream>#include <stdlib.h>#include "Shape.h"#include "Circle.h"#include "Rect.h"using namespace std;/************************************************************************//*动态多态,虚函数要求:1.定义Shape类,成员函数:calcArea(),构造函数,析构函数2.定义Rect类,数据成员:calcArea(),构造函数,析构函数数据成员:m_dWidth,m_dHeight3.定义Circle类,成员函数:calcArea(),构造函数,析构函数数据成员:m_dR*//************************************************************************/int main(void){Shape *shap1 = new Rect(5,7);Shape *shap2 = new Circle(5);shap1->calcArea();shap2->calcArea();delete shap1;shap1 = NULL;delete shap2;shap2 = NULL;system("pause");return 0;}/*Shape() //22行代码,创建一个Rect类。调用构造函数。Rect()Shape() //23行代码,创建一个Circle类。调用构造函数。Circle()Shape->calcArea() //25行代码,shap1的calcArea()。因为父类 Shape类的double calcArea();未加virtual关键字,调用的都是父类的calcArea函数Shape->calcArea() //26行代码,shap2的calcArea()。因为父类 Shape类的double calcArea();未加virtual关键字,调用的都是父类的calcArea函数~Shape()  //同样的也是父类的析构函数。~Shape()*/

Shape.h  父类

#ifndef SHAPE_H#define SHAPE_H#include <iostream>using namespace std;class Shape{public:Shape();~Shape();double calcArea();//virtual double calcArea();};#endif


Shape.cpp

#include "Shape.h"Shape::Shape(){cout << "Shape()" << endl;}Shape::~Shape(){cout << "~Shape()" << endl;}double Shape::calcArea(){cout << "Shape->calcArea()" << endl;return 0;//error C4716: “Shape::calcArea”: 必须返回一个值}


Circle.h

#ifndef CIRCLE_H#define CIRCLE_H#include "Shape.h"class Circle:public Shape{public:Circle(double r);~Circle();double calcArea();protected:double m_dR;};#endif


Circle.cpp

#include "Circle.h"Circle::Circle(double r){cout << "Circle()" << endl;m_dR = r;}Circle::~Circle(){cout << "~Circle()" << endl;}double Circle::calcArea(){cout << "Circle->calcArea" << endl;return m_dR * m_dR * 3.14;}

Rect.h

#ifndef RECT_H#define RECT_H#include "Shape.h"class Rect:public Shape{public:Rect(double width, double heigth);~Rect();double calcArea();protected:double m_dWidth;double m_dHeight;};#endif

Rect.cpp

#include "Rect.h"Rect::Rect(double width, double heigth){cout << "Rect()" << endl;m_dHeight = heigth;m_dWidth = width;}Rect::~Rect(){cout << "~Rect()" << endl;}double Rect::calcArea(){cout << "Rect->calcArea()" << endl;return m_dHeight*m_dWidth;}




Shape() //22行代码,创建一个Rect类。调用构造函数。
Rect()

Shape() //23行代码,创建一个Circle类。调用构造函数。
Circle()

Shape->calcArea() //25行代码,shap1的calcArea()。因为父类 
Shape类的double calcArea();未加virtual关键字,调用的都是父类的calcArea函数
Shape->calcArea() //26行代码,shap2的calcArea()。因为父类 
Shape类的double calcArea();未加virtual关键字,调用的都是父类的calcArea函数
~Shape()  //同样的也是父类的析构函数。
~Shape()


******************************************************************************************************************

在Shape类中的成员函数中添加virtual



code  点击打开链接

**************************************************************************************************************




virtual析构函数 虚析构函数


结果:


运行结果:
Shape() 
//25行代码,创建一个Rect类。调用构造函数。
Rect()
Shape() 
//26行代码,创建一个Circle类。调用构造函数。因为Circle类中多了一个Coordinate()类。so,构造函数时,也构造了Coordinate()。

Circle()
Coordinate()


Rect->calcArea()   
//shap1的calcArea()。因为父类Shape类的double calcArea()加了virtual关键字,调用的都是子类的calcArea函数
Circle->calcArea() 
//shap1的calcArea()。因为父类Shape类的double calcArea()加了virtual关键字,调用的都是子类的calcArea函数
~Rect()                  //同样的,析构函数也是调用的子类的析构函数。注意:析构的顺序。
~Shape()


~Coordinate()     //注意:析构的顺序。Circle类,先析构圆点坐标类,在圆类,在析构父类。
~Circle()
~Shape()
请按任意键继续. . .

code
/************************************************************************//*                        demo.cpp                                      *//************************************************************************/#include <iostream>#include <stdlib.h>#include "Shape.h"#include "Circle.h"#include "Rect.h"#include "Coordinate.h"using namespace std;/************************************************************************//*动态多态,虚函数要求:1.定义Shape类,成员函数:calcArea(),构造函数,析构函数2.定义Rect类,数据成员:calcArea(),构造函数,析构函数数据成员:m_dWidth,m_dHeight3.定义Circle类,成员函数:calcArea(),构造函数,析构函数数据成员:m_dR,m_pCenter4.定义Coordinate类。成员函数:构造函数,析构函数数据成员:m_iX, m_iY;*//************************************************************************/int main(void){Shape *shap1 = new Rect(5,7);Shape *shap2 = new Circle(5);shap1->calcArea();shap2->calcArea();delete shap1;shap1 = NULL;delete shap2;shap2 = NULL;system("pause");return 0;}/*运行结果:Shape() //25行代码,创建一个Rect类。调用构造函数。Rect()Coordinate()Shape() //26行代码,创建一个Circle类。调用构造函数。因为Circle类中多了一个Coordinate()类。so,构造函数时,构造了Coordinate()。Circle()Coordinate()Rect->calcArea()   //shap1的calcArea()。因为父类Shape类的double calcArea()加了virtual关键字,调用的都是子类的calcArea函数Circle->calcArea() //shap1的calcArea()。因为父类Shape类的double calcArea()加了virtual关键字,调用的都是子类的calcArea函数~Rect()            //同样的,析构函数也是调用的子类的析构函数。注意:析构的顺序。~Shape()~Coordinate()     //注意:析构的顺序。Circle类,先析构圆点坐标类,在圆类,在析构父类。~Circle()~Shape()请按任意键继续. . .*//************************************************************************//*                        Shape.h                                       *//************************************************************************/#ifndef SHAPE_H#define SHAPE_H#include <iostream>using namespace std;class Shape{public:Shape();virtual ~Shape(); //虚析构函数//double calcArea();virtual double calcArea();};#endif/************************************************************************//*                        Shape.cpp                                     *//************************************************************************/#include "Shape.h"Shape::Shape(){cout << "Shape()" << endl;}Shape::~Shape(){cout << "~Shape()" << endl;}double Shape::calcArea(){cout << "Shape->calcArea()" << endl;return 0;//error C4716: “Shape::calcArea”: 必须返回一个值}/************************************************************************//*                        Rect.h                                        *//************************************************************************/#ifndef RECT_H#define RECT_H#include "Shape.h"class Rect:public Shape{public:Rect(double width, double heigth);virtual ~Rect();   //子类如果,不加virtual,编译器编译时会默认添加。建议自己添加virtual double calcArea(); //子类如果,不加virtual,编译器编译时会默认添加。建议自己添加。protected:double m_dWidth;double m_dHeight;};#endif/************************************************************************//*                        Rect.cpp                                      *//************************************************************************/#include "Rect.h"using namespace std;Rect::Rect(double width, double heigth){cout << "Rect()" << endl;m_dWidth = width;m_dHeight = heigth;}Rect::~Rect(){cout << "~Rect()" << endl;}double Rect::calcArea(){cout << "Rect->calcArea()" << endl;return m_dHeight * m_dWidth;}/************************************************************************//*                        Circle.h                                      *//************************************************************************/#ifndef CIRCLE_H#define CIRCLE_H#include "Shape.h"#include "Coordinate.h"class Circle:public Shape{public:Circle(double r);virtual ~Circle();virtual double calcArea();protected:double m_dR;Coordinate *m_pCenter; //增加Coordinate类};#endif/************************************************************************//*                        Circle.cpp                                    *//************************************************************************/#include "Circle.h"Circle::Circle(double r){cout << "Circle()" << endl;m_dR = r;m_pCenter = new Coordinate(3,5); //析构函数,从堆中申请内存,注意delete}Circle::~Circle(){delete m_pCenter; //析构函数 释放内存 指针指向NULL。防止野指针. m_pCenter = NULL;cout << "~Circle()" << endl;}double Circle::calcArea(){cout << "Circle->calcArea()" << endl;return m_dR * m_dR * 3.14;}/************************************************************************//*                        Coordinate.h                                  *//************************************************************************/#ifndef COORDINATE_H#define COORDINATE_H/*定义Coordinate类。成员函数:构造函数,析构函数数据成员:m_iX, m_iY;*/class Coordinate{public:Coordinate(int x, int y);~Coordinate();private:int m_iX;int m_iY;};#endif/************************************************************************//*                        Coordinate.cpp                                *//************************************************************************/#include <iostream>#include "Coordinate.h"using namespace std;Coordinate::Coordinate(int x, int y){cout << "Coordinate()" << endl;m_iX = x;m_iY = y;};Coordinate::~Coordinate(){cout << "~Coordinate()" << endl;};


0 0
原创粉丝点击