C++实验8报告多态性与虚函数

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://laiczhang.com。 https://blog.csdn.net/qq_44621510/article/details/90724548

所使用的开发工具及环境: PC机一套

实验目的:
(1)了解多态性的概念。
(2)了解虚函数的作用及使用方法。
(3)了解静态关联和动态关联的概念和川法。
(4)了解纯虚函数和抽象类的概念和用法。

实验内容:
1、分析程序运行结果,掌握虚函数的使用。
程序一:

#include <iostream>
using namespace std;
class ONE
{  public:
      virtual void f(){cout<<"ONE"<<endl;}
};
class TWO:public ONE
{  public:
      TWO(){cout<<"TWO"<<endl;}
};
class THREE:public TWO
{  public:
      virtual void f(){TWO::f(); cout<<"THREE";}
};
void main()
{  ONE aa, *p;
   TWO bb;  //TWO
   THREE cc;  //TWO
   p = &cc;
   p->f();//ONE THREE
   cout<<endl;
}

程序二:

#include <iostream>
using namespace std;
class Base
{ public:
   virtual void fn() { cout <<"In Base Class\n";}
};
class SubClass :public Base
{  public:
    virtual void fn(){  cout <<"In Sub Class\n";  }//覆盖
};
void main()
{   Base bc,*p;
    SubClass sc;
    p=&bc;   p->fn();//In Base Class
    p=&sc;   p->fn();//In Sub Class
}

2、实现一个类A,在A中有两个私有的整型变量a和b,定义构造函数对a和b进行初始化,并实现成员函数geta()取得a的值和getb()取b的值。实现类B从A继承,覆盖geta(),使其返回a的2倍。主函数中声明类B对象,调用类B中的geta()并将结果输出。

#include<iostream>
using namespace std;
class A
{
	public:
		A(int a,int b):a(a),b(b){}
		virtual int geta(){return a;}
		friend class B;
private:
	int a;
	int b;
};
class B:public A
{
public:
	B(int a,int b):A(a,b){}
	int geta(){return 2*a;}
};
int main()
{
	A *p=new B(2,3);
	cout<<p->geta()<<endl;
system("pause");
return 0;
}

3、设计一个计算图形面积的类库。它的顶层是一个抽象类,并且提供相应的接口函数。抽象基类Shape,派生出Point类、矩形Rectangle、正方形Square,Point类派生出圆形Circle。 要求:
(1)每个类有构造函数、析构函数,并有相应的输出语句,如:“正在构造圆形”
(2)能显示每个类的信息,如:输出“我是圆形”
(3)能计算面积、周长
(4)定义一个基类Shape类型的指针,实现动态多态
(5)动态创建一个圆形对象,赋值给基类Shape类型的指针变量,程序最后delete该指针,保证析构函数的正确调用(提示:虚析构函数)
(6)在主函数测试。

#include<iostream>
using namespace std;
const double PI=3.1415926;
class Shape
{
public:
	Shape(){cout<<"Constructing Shape..."<<endl;}
	virtual ~Shape(){cout<<"Destructing Shape..."<<endl;}
	virtual void Name(){cout<<"Share"<<endl;}
	virtual double Area()=0;
	virtual double C()=0;
};
class Point: public Shape
{
public:
	Point(){cout<<"Constructing Point..."<<endl;}
	~Point(){cout<<"Destructing Point..."<<endl;}
	virtual void Name(){cout<<"Point"<<endl;}
	double Area(){return 0;}
	double C(){return 0;}
};
class Rectangle:public Shape
{
public:
	Rectangle(int l,int w):length(l),width(w){cout<<"Constructing Rectangle..."<<endl;}
	~Rectangle(){cout<<"Destructing Rectangle..."<<endl;}
	double Area(){return length*width;}
	double C(){return (length+width)*2;}
	void Name(){cout<<"Rectangle"<<endl;}
private:
	double length;
	double width;
};
class Squre:public Shape
{
public:Squre(int l):L(l){cout<<"Constructing Squre..."<<endl;}
	   ~Squre(){cout<<"Destructing Squre..."<<endl;}
	   void Name(){cout<<"Squre"<<endl;}
	   double Area(){return L*L;}
	   double C(){return 4*L;}
private:
	double L;
};
class Circle: public virtual Point
{
public:
	Circle(double r):radious(r){cout<<"Constructing Circle..."<<endl;}
	~Circle(){cout<<"Destructing Circle..."<<endl;}
	void Name(){cout<<"Circle"<<endl;}
	double Area(){return PI*radious*radious;}
	double C(){return 2*PI*radious;}
private:
	double radious;
};
int main()
{
	Shape *p;
	p=new Point;
	p->Name();
	cout<<"C:"<<p->C()<<endl;
	cout<<"Area:"<<p->Area()<<endl;
	delete p;
	cout<<endl;
	 p=new Rectangle(2,3);
	p->Name();
	cout<<"C:"<<p->C()<<endl;
	cout<<"Area:"<<p->Area()<<endl;
	delete p;
	cout<<endl;
	p=new Squre(4);
	p->Name();
	cout<<"C:"<<p->C()<<endl;
	cout<<"Area:"<<p->Area()<<endl;
	delete p;
	cout<<endl;
	p=new Circle(5);
	p->Name();
	cout<<"C:"<<p->C()<<endl;
	cout<<"Area:"<<p->Area()<<endl;
	delete p;
	system("pause");
}

4、设计一个基类Base,其作用是计算一个图形的面积,它只有一个公有的函数成员虚函数area。再从Base 类公有派生一个三角形类Triangle 和一个圆类Circle,在类Triangle 和类Circle 中分别定义自己的area 函数,用于计算各自的面积。在主函数中设计一个Base 类的对象指针,分别指向类Triangle 和类Circle 的对象,调用各自的area 函数显示相应 对象的面积。
分析:用虚函数实现多态。

#include<iostream>
#include<iostream>
using namespace std;
const double PI=3.1415926;
class Base
{
public:
	Base(){cout<<"Constructing Base..."<<endl;}
	virtual ~Base(){cout<<"Destructed Base."<<endl;}
	virtual double Area()=0;
};
class Triangle:public Base
{
public:
	Triangle(double a,double b,double c):a(a),b(b),c(c){cout<<"Constructing Triangle..."<<endl;}
	~Triangle(){cout<<"Destructed Triangle."<<endl;}
	double Area(){return sqrt(0.5*(a+b+c)*(0.5*(a+b+c)-a)*(0.5*(a+b+c)-b)*(0.5*(a+b+c)-c));}
private:
	double a,b,c;
};
class Circle:public Base
{
public:
	Circle(double r):radious(r){cout<<"Constructing Circle..."<<endl;}
	~Circle(){cout<<"Destructed Circle."<<endl;}
	double Area(){return PI*radious*radious;}
private:
	double radious;
};
int main()
{
	Base *p;
	p=new Triangle(3,4,5);
	cout<<"Area:"<<p->Area()<<endl;
	delete p;
	cout<<endl;
	p=new Circle(4);
	cout<<"Area:"<<p->Area()<<endl;
	delete p;
	cout<<endl;
	system("pause");
	return 0;
}

5.将上题中的Base 类改为抽象类,应用抽象类,求矩形、圆形的周长和面积。
分析:将Base 类的其成员函数area 和perimeter 声明为纯虚函数,Base 就成为一个抽 象类。然后再从Base 派生矩形类和圆形类,分别实现Base 中纯虚函数的功能.

#include<iostream>
using namespace std;
const double PI=3.1415926;
class Base
{
public:
	Base(){cout<<"Constructing Base..."<<endl;}
	virtual ~Base(){cout<<"Destructed Base."<<endl;}
	virtual double Area()=0;
	virtual double Perimeter()=0;  //周长
};
class Triangle:public Base
{
public:
	Triangle(double a,double b,double c):a(a),b(b),c(c){cout<<"Constructing Triangle..."<<endl;}
	~Triangle(){cout<<"Destructed Triangle."<<endl;}
	double Area(){return sqrt(0.5*(a+b+c)*(0.5*(a+b+c)-a)*(0.5*(a+b+c)-b)*(0.5*(a+b+c)-c));}
	double Perimeter(){return a+b+c;}
private:
	double a,b,c;
};
class Circle:public Base
{
public:
	Circle(double r):radious(r){cout<<"Constructing Circle..."<<endl;}
	~Circle(){cout<<"Destructed Circle."<<endl;}
	double Area(){return PI*radious*radious;}
	double Perimeter(){return 2*PI*radious;}
private:
	double radious;
};
int main()
{
	Base *p;
	p=new Triangle(3,4,5);
	cout<<"Area:"<<p->Area()<<endl;
	cout<<"Perimeter:"<<p->Perimeter()<<endl;
	delete p;
	cout<<endl;
	p=new Circle(4);
	cout<<"Area:"<<p->Area()<<endl;
	cout<<"Perimeter:"<<p->Perimeter()<<endl;
	delete p;
	cout<<endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44621510/article/details/90724548