_Phoebe__ 2022-03-22 19:26 采纳率: 96.9%
浏览 25
已结题

编译有问题想知道哪里错了怎么改

// 定义一个抽象类CShape (至少有一个函数被声明为纯虚函数);
// 再利用CShape分别定义两个派生类CRectangle(矩形)和CCirle(圆),
//三个类都有计算面积的成员函数GetArea()和计算对象周长的成员函数GetPerimeter() ;
// 在主函数中声明基类指针和派生类对象,并通过基类指针调用不同对象的成员函数GetArea() 和GetPerimeter()。
//在第1题基础上再定义三个CShap的派生类CSquare(正方形)、CTrapezoid(梯形)、CTriangle(三角形);
//分别用虚函数计算五种图形的面积,并求它们的和;
//要求用基类指针数组,使它的每一个元素指向一个派生类。


#include<bits/stdc++.h>
using namespace std;
class CShape
{
    public:
        virtual double GetArea()=0;
        virtual double GetPerimeter()=0;
};
class CRectangle:public CShape
{
    private:
        double length,width;
    public:
        CRectangle(double length_,double width_){
            length=length_;
            width=width_;
        }
        virtual double GetArea()
        {
            double p;
            p=length*width;
            cout<<"矩形的面积为:"<<p<<endl;
            return p;
        }
        virtual double GetPerimeter(){
            double c;
            c=length+width;
            cout<<"矩形的周长为:"<<c<<endl; 
            return c;
        }
};
class CCircle:public CShape
{
    private:
        double r;
    public:
        CCircle(double r_){
            r=r_;
        }
    virtual double GetArea()
    {
        double sq;
        double pi=3.14;
        sq=pi*r*r;
        cout<<"圆的面积"<<sq<<endl;
        return sq;
    }
    virtual double GetPerimeter(){
        double sc;
        double pi=3.14;
        sc=2*pi*r;
        cout<<"圆的周长"<<sc<<endl; 
        return sc;
    }
};
class CSquare:public CShape{
    double d;
    public:
    CSquare(double d_){
            d=d_;
        }
    virtual double GetArea(){
      double s;
      s=d*d;
      cout<<"正方形面积"<<s<<endl;
      return s; 
    }
};
class CTriangle{
    double m,n,t;//三角形三条边
    public:
    CTriangle(double m_,double n_,double t_):m(m_),n(n_),t(t_){
    }
    
    virtual double GetArea(){
      double st,q;
      q=(m+n+t)/2;
      st=sqrt(q*(q-m)*(q-n)*(q-t));
      cout<<"三角形面积"<<st<<endl;
      return st; 
    }
};
class CTrapezoid:public CShape{
public:
    CTrapezoid(double upper,double below,double traHeight):up(upper),down(below),th(traHeight){}
    double up,down,th;
    virtual double GetArea(){
        double stp;
        stp=(up+down)*th*0.5;
        cout<<"梯形面积:"<<stp<<endl; 
        return stp;
    }
};
int main(){
    CCircle circle(1);
    CSquare square(3.5);
    CRectangle rectangle(4.6,7.8);
    CTrapezoid trapezoid(2.7,4.5,3.1);
    CTriangle triangle(3,4,5);
    CShape *pt[5]={&circle,&square,&rectangle,&trapezoid,&triangle};
    double areas=0;
    for(int i=0;i<5;i++){
        areas=areas+pt[i]->GetArea();
    }
    cout<<"总面积为:"<<areas<<endl;
    return 0;
}

谢谢大家!

  • 写回答

1条回答 默认 最新

  • 春休夏末 2022-03-22 19:32
    关注

    子类必须要重写基类中的所有纯虚函数
    就是所有继承自纯虚类 CShape类的子类中 都必须有
    virtual double GetArea();
    virtual double GetPerimeter();
    这两个函数 只重写其中一个是不可以的,必须全部重写 否则 子类也会变成纯虚类

    第二个问题就是70行 CTriangle类并没有继承自CShape, 所以101行中 最后一个变量 triangle 类型和 CShape不一致 所以会报错 应该CTriangle也要继承下CShape类或者101行去掉最后一个变量

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月22日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度