问题及代码:
/* *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;
只有继承虚函数,并覆盖了同名的虚函数,才可以利用指向基类的指针自由指向派生类的同名成员函数,实现动态多态性
时间: 2024-12-24 16:15:28