问题及代码:
/*
*Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:project.cpp
*作 者:陈文青
*完成日期:2015年6月6日
*版 本 号:v1.0
*
*问题描述:设计一个抽象类CSolid,含有用于求表面积及体积的两个纯虚函数。
设计派生类CCube、CBall、CCylinder,分别表示正方体、球体及圆柱体。
在main()函数中,定义CSolid *p;(p是指向基类的指针,且这个基类是个抽象类)。
要求利用这个p指针,能够求出正方体、球体及圆柱体对象的表面积及体积。
*程序输入:
*程序输出:
*/
#include<iostream>
using namespace std;
//定义虚基类
class CSolid
{
public:
virtual double get_area() =0; //关于表面积的纯虚函数
virtual double get_volume() =0; //关于体积的纯虚函数
};
//定义正方体类
class CCube:public CSolid
{
public:
CCube(double l=0,double w=0,double h=0):length(l),width(w),height(h) {} //长方体类的构造函数
double get_area()
{
return 2*(length*width+length*height+width*height);
}
double get_volume()
{
return length*width*height;
}
protected:
double length; //长
double width; //宽
double height; //高
};
//定义球体类
class CBall:public CSolid
{
public:
CBall(double r=0):radius(r) {} //球体的构造函数
double get_area()
{
return 4*3.14*radius*radius;
}
double get_volume()
{
return 4/3*3.14*radius*radius*radius;
}
protected:
double radius; //半径
};
//定义圆柱体类
class CCylinder:public CSolid
{
public:
CCylinder(double r=0,double h=0):radius(r),height(h) {} //圆柱的构造函数
double get_area()
{
return 3.14*radius*radius*2+2*3.14*radius*height;
}
double get_volume()
{
return 3.14*radius*radius*height;
}
protected:
double radius; //地面半径
double height; //高
};
//测试函数
int main()
{
double s,v; //表示表面积和体积
CSolid *p; //指向基类的指针
CCube a(1,1,1);
cout<<"长方体的长:1\t宽:1\t高:1"<<endl;
p=&a; //指向长方体的对象
s=p->get_area( );
v=p->get_volume( );
cout<<"表面积:"<<s<<endl;
cout<<"体积:"<<v<<endl<<endl;
CBall b(1);
cout<<"球的半径:1"<<endl;
p=&b; //指向球的对象
s=p->get_area( );
v=p->get_volume( );
cout<<"表面积:"<<s<<endl;
cout<<"体积:"<<v<<endl<<endl;
CCylinder c(1,1);
cout<<"圆柱体的底面半径:1\t高:1"<<endl;
p=&c; //指向圆柱的对象
s=p->get_area( );
v=p->get_volume( );
cout<<"表面积:"<<s<<endl;
cout<<"体积:"<<v<<endl<<endl;
return 0;
}
运行结果:
知识点总结:
抽象类的定义: virtual 加上 =0;
只有继承虚函数,并覆盖了同名的虚函数,才可以利用指向基类的指针自由指向派生类的同名成员函数,实现动态多态性