所使用的开发工具及环境: 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=≻ 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;
}