C++继承与派生中的抽象类

img


这个怎么会是错的,我要怎么改才能让他正确。


#include<iostream>
using namespace std;
const double pi=3.14;
class Shape

{

public:

       virtual double Area()=0;

       virtual double Perimeter() = 0;

};

int main()

{

      double r,a,b;

       char *s[2]={"Circle:\n","Rectangle:\n"};

       cin>>r>>a>>b;

       Shape *ptr[]={new Circle(r),new Rectangle(a,b)};

       for(int i=0;i<2;i++)

       {

              cout<<s[i];

              cout<<"Area:"<<ptr[i]->Area()<<endl;

              cout<<"Perimeter:"<<ptr[i]->Perimeter()<<endl;

       }

       return 0;

}
class Circle :public Shape
{
       private:
                double r;
       public:
                Circle(double rr)
                {
                        r=rr;
                }
                double Area()
                {
                       return pi*r*r;
                }
                double Perimete()
                {
                       return 2*pi*r;
                }
};

class Rectangle :public Shape
{
       private:
                double a;
                double b;
       public:
                Rectangle(double a,double b) :a(a),b(b)
                {
                        this->a=a;
                        this->b=b;
                }
                double Area()
                {
                    return a*b;
                }
                double Perimete()
                {
                    return (a+b)*2;
                }         
};

帮你修改好了

#include <iostream>

using namespace std;

const double pi = 3.14;

class Shape
{
public:
    virtual ~Shape() {}
    virtual double Area() const = 0;
    virtual double Perimeter() const = 0;
};

class Circle : public Shape
{
private:
    double _r;

public:
    Circle(double r) : _r(r) {}
    virtual ~Circle() {}

    virtual double Area() const override
    {
        return pi * _r * _r;
    }

    virtual double Perimeter() const override
    {
        return 2.0 * pi * _r;
    }
};

class Rectangle : public Shape
{
private:
    double _a;
    double _b;

public:
    Rectangle(double a, double b) : _a(a), _b(b) {}
    virtual ~Rectangle() {}

    virtual double Area() const override
    {
        return _a * _b;
    }

    virtual double Perimeter() const override
    {
        return (_a + _b) * 2.0;
    }
};

int main()
{

    double r, a, b;

    const char *s[2] = {"Circle:\n", "Rectangle:\n"};

    cin >> r >> a >> b;

    Shape *ptr[] = {new Circle(r), new Rectangle(a, b)};

    for (int i = 0; i < 2; i++)
    {
        cout << s[i];
        cout << "Area:" << ptr[i]->Area() << endl;
        cout << "Perimeter:" << ptr[i]->Perimeter() << endl;
        delete ptr[i];
    }

    return 0;
}

那两个类提前定义,否则main函数里无法使用

好了,谢谢两位,我改出来了,另外两个周长函数少写个r

#include<iostream>
using namespace std;
const double pi=3.14;
class Shape

{

public:

       virtual double Area()=0;

       virtual double Perimeter() = 0;

};

class Circle : public Shape
{
       private:
                double r;
       public:
                Circle(double rr) : Shape()
                {
                          r=rr;
                }
                double virtual Area()
                {
                       return pi * r * r;
                }
                virtual double Perimeter()
                {
                       return 2.0*pi*r;
                }
};

class Rectangle : public Shape
{
       private:
                double a;
                double b;
       public:
                Rectangle(double aa, double  bb) : Shape()
                {
                           a=aa;
                           b=bb;
                }
                virtual double Area()
                {
                    return a*b;
                }
                virtual double Perimeter()
                {
                    return (a+b)*2.0;
                }
};
int main()

{

      double r,a,b;

       char *s[2]={"Circle:\n","Rectangle:\n"};

       cin>>r>>a>>b;

       Shape *ptr[]={new Circle(r),new Rectangle(a,b)};

       for(int i=0;i<2;i++)

       {

              cout<<s[i];

              cout<<"Area:"<<ptr[i]->Area()<<endl;

              cout<<"Perimeter:"<<ptr[i]->Perimeter()<<endl;

       }

       return 0;

}