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_dHeight
3.定义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
#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
#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()
Shape()
//25行代码,创建一个Rect类。调用构造函数。
Rect()
Shape()
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()
请按任意键继续. . .
~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_dHeight
3.定义Circle类,成员函数:calcArea(),构造函数,析构函数
数据成员:m_dR,m_pCenter
4.定义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;
};