C ++从具体类继承到另一个具体类

时间:2013-08-05 23:21:55

标签: c++

我试图继承我的一个2类变量,它们必须等于能够在另一个类中返回我的一个函数的值。

class Rectangle: public Shape{

    double Length;
    double Width;

    public:
        Rectangle(double Length, double Width):
            Shape("Rectangle")
        {
            this->Length=Length;
            this->Width=Width;
        }

        double getPerimerter(){
            return 2 * (Length+Width);
        }

        double getArea(){
            return Length * Width;
        }
};

class Square: public Shape, public Rectangle{

    double Side;

    public:
    Square():
        Shape("Square"),
        Rectangle(Length,Width)
    {}

    double getPerimerter(){
        if(Length==Width)
        return 4 * (Length+Width);
    }

    double getArea(){
        if(Length==Width)
        return (Length+Width) * (Length+Width);
    }

};

正如你所看到的,我已经有了一个具体的类调用Rectangle,它保存了名为Length和Width的私有变量。我试图做的是将这个类继承到我的类Square,如果是Length和Width等于然后我可以返回广场的面积和周长..

3 个答案:

答案 0 :(得分:2)

首先,您应该为Square构造函数添加一个参数,如下所示:

Square(double Side):Rectangle(Side,Side){
    // Add additional constructor code here if required
}

关于在构造函数中返回一个值 - 这是一个禁忌,因为构造函数可能不会返回任何内容。

我希望这就是你的意思,因为我很难理解你的问题。

答案 1 :(得分:2)

从现有的类继承是完全没问题的。

然而,你可能想要的是:

 class Square: public Rectangle
 {
    public:
       Square(double Side) : Rectangle(Side, Side) { }
 };

这样,没有人试图使用矩形方Square(4.3, 9.6)

或者,您当然可以使用typedef Rectangle Square;

编辑:

要克服“名称”,我们可以这样做:

class Rectangle
{
    public:
       Rectangle(double Length, double Width) : Shape("Rectangle") { ... } 
    protected:
       Rectangle(double Length, double Width, const char *name) : Shape(name), Length(Length), Width(Width) {}
};

class Square
{
  public:
   Square(double side) : Rectangle(side, side, "Square") {}
};

Edit2:我提出的代码:

#include <iostream>

using namespace std;


class Shape
{
private:
    const char *name;

public:
    Shape(const char *name) : name(name) {}
    virtual double getPerimeter() = 0;
    virtual double getArea() = 0;
};


class Rectangle: public Shape{

    double Length;
    double Width;

    public:
        Rectangle(double Length, double Width):
            Shape("Rectangle")
        {
            this->Length=Length;
            this->Width=Width;
        }

        double getPerimeter(){
            return 2 * (Length+Width);
        }

        double getArea(){
            return Length * Width;
        }

protected:
    Rectangle(double Length, double Width, const char *name):
            Shape(name)
        {
            this->Length=Length;
            this->Width=Width;
        }

};

class Square: public Rectangle
{

    public:
    Square(double Side):
        Rectangle(Side,Side, "Square")
    {    
    }
};

int main()
{
    Square sq(10.0);
    Rectangle rect(12.0, 4.0);

    cout << "sq:" << sq.getArea() << " rect:" << rect.getArea() << endl; 
}

答案 2 :(得分:0)

我可能不理解你的问题,但在我看来你只需要在Square()构造函数中添加一个参数。它看起来像这样:

class Square: public Rectangle{

    public:
        Square(double dimension):
            Rectangle(dimension, dimension){
        }

};

Square()构造函数中不需要条件语句。创建一个Square必然意味着创建一个长度和宽度相等的Rectangle。