虚函数和纯虚函数

#include<iostream>
using namespace std;
class CPoint
{
public:
	double x,y;
	CPoint(double a,double b);
	virtual double area();//此处需要用虚函数
};

CPoint::CPoint(double a,double b)
{
	x=a;
	y=b;
}

double CPoint:: area()
{
	return 110;
}

class CRectangle:public CPoint
{
	double z;
public:
	CRectangle(double a,double b):CPoint(a,b)
	{
		z=0.0;
	}
	virtual double  area();//此处需要用虚函数
};

double CRectangle::area()
{
	z=x*y;
	return z;
}

void main()
{
	CPoint p1(3.8,6.7);
	CRectangle r1(5.6,9.9);	

	CPoint *q;
	q=&r1;
	cout << q->area() << endl;
	cout << "-----------" << endl;

	q=&p1;
	cout << q->area() << endl;
	cout << "-----------" << endl;

	CPoint &m=r1;
	cout <<m.area() << endl;

	cout << r1.area() << endl;
}																														


为改为虚函数时候:

声明的指针p为基类CPoint的对象指针,因此在编译时候,编译系统为语句 cout << q->area() << endl;中的q->area()绑定CPoint::area() 函数。运行时候虽然基类对象指针p指向了派生类对象r1,但是由于系统已经静态绑定了基类的成员函数area(),因此该语句并没有调用派生类的成员函数。

另外,在程序中又声明了一个基类对象的引用m,并将其初始化为派生类对象r1,。由于基类中的成员函数area()是一般的成员函数,编译系统为语句cout <<m.arae() <<endl;中的m.area()绑定了CPoint::area()函数,因此该语句调用基类中的成员函数area()。

运行是多态性必须由虚函数来完成。


#include<iostream>
using namespace std;

class CFigure
{
protected:
	float x,y;
public:
	void setdim(float i,float j=0)
	{
		x=i;
		y=j;
	}
	virtual void area()=0;
};

class CTriangle:public CFigure
{
public:
	void area()
	{
		cout << "三角形的底边和高分别是:" << x << ","<< y << endl;
		cout << "三角形的面积是:" << x*0.5*y << endl;
	}
};

class CSquare:public CFigure
{
public:
	void area()
	{
		cout <<"矩形的长和宽分别是:"<< x << "," << y <<endl;
		cout << "矩形的面积是:"  << x*y << endl;
	}
};

class CCircle:public CFigure
{
public:
	void area()
	{
		cout <<"圆的半径是:" << x <<endl;
		cout << "圆的面积是:" <<3.14*x*x << endl;
	}
};

void main()
{
	CFigure *p;
	CTriangle t;
	CSquare s;
	CCircle c;

	p=&t;
	p->setdim(10.0,5.0);
	p->area();

	p=&s;
	p->setdim(10.0,5.0);
	p->area();

	p=&c;
	p->setdim(9.0);
	p->area();
}


由基类CFigure派生出了CTriangle类、CSquare类和CCircle类。基类CFigure的成员函数area()是纯虚函数。他的实现分别在派生类中定义。在main()函数中,通过基类指针指向不同的派生类对象时,就调用派生类中area()函数的不同实现版本,从而实现了运行时的多态性。

#include<iostream> using namespace std; class CShape{ public:float Area; float Perimeter; CShape() { Area=0;Perimeter=0; } virtual void GetArea(){} virtual void GetPerimeter(){} }; class CRectangle:public CShape{ private: int l;int h; public: CRectangle(int h,int l ):CShape() {this->h=h;this->l=l; } void GetArea() {Area=l*h;cout<<"矩形的面积="<<Area<<endl;} void GetPerimeter() {Perimeter=(l+h)*2;cout<<"矩形的周长="<<Perimeter<<endl; } }; class CCirle:public CShape{ private:float r; public:CCirle(float r):CShape() {this->r=r; } void GetArea() { Area=3.14159*r*r; cout<<"圆的面积="<<Area<<endl; } void GetPerimeter() { Perimeter=r*3.14159*2; cout<<"圆的周长="<<Perimeter<<endl; } }; class CSquare:public CShape{ private: int a; public: CSquare(int a):CShape() { this->a=a; } void GetArea() { Area=a*a; cout<<"正方形面积="<<Area<<endl; } void GetPerimeter() { Perimeter=4*a; } }; class CTrapeziod:public CShape{ private: int lu; int ld; int h; public: CTrapeziod(int lu,int ld,int h):CShape() { this->lu=lu; this->ld=ld; this->h=h; } void GetArea() { Area=(lu+ld)*h/2; cout<<"梯形面积="<<Area<<endl; } }; class CTrangle:public CShape{ private: int d; int h; public: CTrangle(int d,int h):CShape() { this->d=d; this->h=h; } void GetArea() { Area=d*h/2; cout<<"三角形的面积="<<Area<<endl; } }; void main() { CShape *p[5]; CRectangle CR(5,10); CCirle CC(3); CSquare CS(4); CTrapeziod CT1(2,5,4); CTrangle CT2(6,2); p[0]=&CR; p[0]->GetArea(); p[1]=&CC; p[1]->GetArea(); p[2]=&CS; p[2]->GetArea(); p[3]=&CT1; p[3]->GetArea(); p[4]=&CT2; p[4]->GetArea(); int i, double SumArea=0.f; for(i=0;i<5;i++) { SumArea=p[i]->Area+SumArea; } cout<<"面积总和="<<SumArea<<endl; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值