第13周-任务3-抽象基类Shape及派生类Circle、Rectangle和Triangle

【题目】写一个程序,定义抽象基类Shape,由它派生出3个派生类,Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的mian()函数,求出定义的几个几何体的面积和。

int main()
{
	Circle c1(12.6),c2(4.9);    //建立Circle类对象c1,c2,参数为圆半径
	Rectangle r1(4.5,8.4),r2(5.0,2.5);       //建立Rectangle类对象r1,r2,参数为矩形长、宽
	Triangle t1(4.5,8.4),t2(3.4,2.8);    //建立Triangle类对象t1,t2,参数为三角形底边长与高
	Shape *pt[6]={&c1,&c2,&r1,&r2,&t1,&t2}; //定义基类指针数组pt,各元素指向一个派生类对象
	double areas=0.0;      //areas为总面积
	for(int i=0; i<6; i++)
	{
		areas=areas+pt[i]->area();
	}
	cout<<"totol of all areas="<<areas<<endl;   //输出总面积
	system("pause");
	return 0;
}

【一点说明】

  从main()函数中可以看出,要用指向Shape的指针pt[i]调用各种形状对应的area()函数,而各种形状求面积的方法当然不同。在这种情况下,在Shape中,将area()处理为虚函数是自然的事了。而确定Shape只用作基类,而不实例化后,将其处理成抽象类,是一种良好设计的考虑。

【参考解答】

#include <iostream>
using namespace std;
//定义抽象基类Shape
class Shape
{
public:
	virtual double area() const =0;            //纯虚函数
};

//定义Circle类
class Circle:public Shape
{
public:
	Circle(double r):radius(r){}                                     //结构函数
	virtual double area() const {return 3.14159*radius*radius;};   //定义虚函数
protected:
	double radius;                                                 //半径
};

//定义Rectangle类
class Rectangle:public Shape
{
public:
	Rectangle(double w,double h):width(w),height(h){}               //结构函数
	virtual double area() const {return width*height;}              //定义虚函数
protected:
	double width,height;                                           //宽与高
};

class Triangle:public Shape
{
public:
	Triangle(double w,double h):width(w),height(h){}                //结构函数
	virtual double area() const {return 0.5*width*height;}          //定义虚函数
protected:
	double width,height;                                            //宽与高
};

int main()
{
	Circle c1(12.6),c2(4.9);                                              //建立Circle类对象c1,c2,参数为圆半径
	Rectangle r1(4.5,8.4),r2(5.0,2.5);                                    //建立Rectangle类对象r1,r2,参数为矩形长、宽
	Triangle t1(4.5,8.4),t2(3.4,2.8);                                     //建立Triangle类对象t1,t2,参数为三角形底边长与高
	Shape *pt[6]={&c1,&c2,&r1,&r2,&t1,&t2};
	//定义基类指针数组pt,使它每一个元素指向一个派生类对象
	double areas=0.0;                                                //areas为总面积
	for(int i=0;i<6;i++)
	{
		areas=areas+pt[i]->area();
	}
	cout<<"totol of all areas="<<areas<<endl;   //输出总面积
	system("pause");
	return 0;
}
时间: 2024-08-30 05:19:00

第13周-任务3-抽象基类Shape及派生类Circle、Rectangle和Triangle的相关文章

第13周-任务4-抽象类CSolid及派生类CCube、CBall、CCylinder

[题目]设计一个抽象类CSolid,含有两个求表面积及体积的纯虚函数.设计个派生类CCube.CBall.CCylinder,分别表示正方体.球体及圆柱体.在main()函数中,定义基类的指针p(CSolid *p;),利用p指针,输出正方体.球体及圆柱体对象的表面积及体积. [参考解答] #include "iostream" using namespace std; const double pai=3.1415926; // 抽象立体图形基类 class CSolid { pub

通过基类来声明派生类有何意义?

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication1{classProgram{staticvoidMain(){MyBaseClassc=newMyDerivedClass();Console.ReadLine();}}publicclassMyBaseClass{pub

基类能否处理派生类返回的对象或参数

问题描述 我看了我们公司的OA产品,有个新增记录的页面是继承了一个基类,然后这个派生类实现了基类的的虚方法,返回的是一个object对象,再然后就可以实现数据的保存,请问这个在基类中是如何实现这个过程的,难道基类可以接受来自派生类返回的对象吗?本人是一个刚毕业的程序员,求大神指导, 解决方案 解决方案二:当然可以了.反过来不行.google里氏替换原则

C02-程序设计基础提高班(C++)第13周上机任务-多态与虚函数

第13周:阅读教材第12章(p395-416),主要内容是多态性,完成第13周上机任务 (回到C02-程序设计基础提高班(C++)学习安排) [任务1]下面给出了基类Animal和main()函数.(1)根据main()函数给出的注释提示,设计出相关的各个类.(2)显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的.改造程序,使Animal设计为抽象类,这时main()函数中p = new Animal();将出错,将此行删除.(3)每一个Animal的派生类

(一四一)抽象基类

抽象基类(abstract base class,简称ABC).   抽象基类的前提是,类方法里有 纯虚函数(pure virtual function). 纯虚函数需要在函数声明的结尾处添加"=0".   当一个类有了纯虚函数之后,它就成为了一个抽象基类. 抽象基类的特点是,不能创造该类的对象.   例如B类和C类的有一定的共同点,把这些共同点(数据成员和方法)抽象出来,创建一个A类,而B类和C类都从A类派生出来.而A类有一个纯虚函数,因此A类就成为了一个抽象基类.   对于纯虚函数

C++第13周项目5 - 类的组合与继承

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8953304 [项目5(选做)]类的组合与继承(1)先建立一个Point(点)类,包含数据成员x,y(坐标点):(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心:(3)编写上述两类中的构造.析构函数及必要的输入输

C++程序设计课程师生互动(2012年春第13周)

[本周感言--一点牢骚] 一些同学的状态还没有恢复.实际上,状态好的仍然保持,状态差的有持续下滑的趋势.结合期中测验的结果,如果有些同学还不改善状态,我真不看好了.近期的时间比春假前要松一些了,但完成的任务却少了.一直处于"赶上来"阶段的同学,每周的任务不去全部完成,跟不住,谈何赶上来.不少同学已经有了属于自己的电脑,是否用于学习,自己知道.反倒是,编程很疯狂的几位,依赖的仅是公共机房. 某天,下课后,几位同学站在路口,商量去哪.有一位提议:"去烟大市场吧." 我知

如何在派生类中的隐藏基类的虚拟重载函数

我创建了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码如下: #include <iostream.h>class B {private: int nNumber;public: virtual void test() { cout << "B::test()\n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::te

为什么基类的析构函数不是虚函数时,就不会调用派生类的析构函数

问题描述 为什么基类的析构函数不是虚函数时,就不会调用派生类的析构函数 我知道,基类的析构函数要生命为虚函数,不然用基类指针删除派生类对象时只会调用基类的析构函数,而不会调用派生类的析构函数,从而发生内存泄露.但是为什么会这样?为什么基类析构函数不是虚函数时,就不会调用派生类析构函数而是虚函数时就会调用派生类析构函数???有没有大神指点一下. 看了几位的回答,都不是我想要的.我已经知道了不声明为虚函数,会造成内存泄露.我想知道为什么会造成内存泄露,原因是什么. 解决方案 1. 析构函数跟普通成员