14周项目2:抽象基类shape

/*
* Copyright (c) 2013, 烟台大学计算机学院
* All rights reserved.
* 作    者:李慧慧
* 完成日期:2013  年  6 月 4  日
* 版 本 号:v1.0
* 输入描述:
* 问题描述:写一个程序,定义抽象基类Shape,由它派生出3个派生类,
*Circle(圆形)、Rectangle(矩形)、Triangle(三角形)。用如下的
*main()函数,求出定义的几个几何体的面积和。
* 程序输出:
* 问题分析:
* 算法设计:略
*/

#include<iostream>
using namespace std;

class Shape
{
public:

   virtual double area() const =0;
};
class Circle:public Shape
{
public:
    Circle(double r):radius(r) {}
    virtual double area() const
    {
        return 3.14*radius*radius;
        }
protected:
        double radius;

};
class Rectangle:public Shape
{
public:
Rectangle(double l,double w):length(l),width(w){}
virtual double area() const
{
    return length*width;
}
protected:
double length;
double width;
};
class Triangle:public Shape
{
public:
Triangle(double w,double h):width(w),heigth(h){}
virtual double area() const
{
    return 0.5*width*heigth;
}
protected:
double width;
double heigth;
};
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;   //输出总面积
    return 0;
}


运行结果:

### 回答1: 在Java中,可以使用"extends"关键字来从抽象类Shape扩展一个圆形Circle。示例代码如下: ``` abstract class Shape { // 抽象方法 public abstract void draw(); } class Circle extends Shape { @Override public void draw() { // 实现圆形绘制代码 } } ``` 在上述代码中,Circle继承了Shape并重写了draw()方法,以实现绘制圆形的功能。 ### 回答2: Shape是所有形状的抽象类,我们可以从它扩展许多子,如矩形、三角形、椭圆等。在这个过程中,我们发现还缺少一个圆形,我们可以从Shape扩展一个圆形Circle来弥补这个不足。 在Circle中,我们可以定义圆的半径作为属性,并利用Shape中定义的抽象方法来计算圆的面积和长。具体而言,我们可以实现如下代码: ``` abstract class Shape { // 定义两个抽象方法 public abstract double area(); public abstract double perimeter(); } class Circle extends Shape { double radius; // 圆的半径 public Circle(double radius) { this.radius = radius; } // 实现Shape中的抽象方法 public double area() { return Math.PI * radius * radius; } public double perimeter() { return 2 * Math.PI * radius; } } ``` 在Circle中,我们首先定义了半径作为属性,并在构造方法中初始化。然后,我们实现了Shape中的两个抽象方法area()和perimeter(),分别用来计算圆的面积和长。其中,圆的面积公式是πr²,长公式是2πr,r是圆的半径。这里,我们直接利用Math中定义好的π常量和平方函数来进行计算。 除此之外,我们还可以添加一些其他的方法,比如判断两个圆是否相等、判断一个点是否在圆内等。总之,从Shape扩展一个圆形Circle是非常简单和自然的,因为圆形作为一种常见的形状,它应该被纳入到我们的形状层次结构中,并且可以享受到Shape中定义好的各种抽象方法和属性的好处。 ### 回答3: 抽象类是面向对象编程中非常重要的概念之一,它是一种特殊的,不能直接创建实例,而是需要继承后才能使用。在Java中,我们用关键字abstract来定义抽象类,并且抽象类中可以包含抽象方法和非抽象方法。 我们先来看一下抽象类shape,它应该包含哪些属性和方法。 首先,shape一个抽象类,不能直接创建实例。其次,它应该包含至少一个抽象方法,用来描述不同形状之间的共性。例如,我们可以定义一个抽象方法来计算形状的面积,因为不同形状的面积计算方式是不同的。 接下来,我们需要扩展一个圆形circle圆形有什么特殊的属性或方法呢?首先,圆形应该拥有一个半径,用来计算面积和长。其次,我们还可以定义一个圆心坐标,方便进行位置上的计算。最后,我们还可以重写shape的抽象方法来计算圆的面积和长。 继承shape后,我们需要在circle中定义自己特有的属性和方法,例如计算长和面积的公式,以及圆心坐标等。同时,我们还需要重写shape中的抽象方法,在circle中实现计算圆的面积和长的方法。 总之,从抽象类shape扩展一个圆形circle,需要确定shape中的抽象方法和非抽象方法,同时在circle中定义自己特有的属性和方法,重写shape中的抽象方法,实现自己特有的计算方法。通过这种方式,我们可以实现代码的重用和扩展性,更好地满足软件开发中的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值