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


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


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_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;
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值