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

C++从一个具体的类继承到另一个具体的类,c++,C++,我试图从我的2类变量中的一个继承,它们必须相等,才能返回另一个类中我的一个函数的值 class Rectangle: public Shape{ double Length; double Width; public: Rectangle(double Length, double Width): Shape("Rectangle") { this->Length=Length;

我试图从我的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);
    }

};

正如您所看到的,我已经有了一个具体的类称为矩形,它包含名为Length和Width的私有变量。。我要做的是将这个类继承到我的类Square中,如果长度和宽度相等,那么我可以返回Square的面积和周长

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

Square(double Side):Rectangle(Side,Side){
    // Add additional constructor code here if required
}
关于在构造函数中返回值-这是不允许的,因为构造函数可能不会返回任何内容


我希望这就是您的意思,因为您的问题对我来说很难理解。

从现有类继承是完全正确的

然而,您可能想要的是:

 class Square: public Rectangle
 {
    public:
       Square(double Side) : Rectangle(Side, Side) { }
 };
这样,就不会有人试图使用角平方4.3,9.6的问题

或者,您当然可以使用typedef矩形正方形

编辑:

为了克服这个名称,我们可以这样做:

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") {}
};
class Square: public Rectangle{

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

};
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; 
}

我可能不理解您的问题,但在我看来,您只需要向方形构造函数添加一个参数。它看起来是这样的:

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") {}
};
class Square: public Rectangle{

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

};

在Square构造函数中不需要条件语句。创建一个正方形必然意味着创建一个长度和宽度相等的矩形。

那么,你到底有什么问题?我不知道怎么做。。我不确定我是否可以从Square类继承私有成员或访问这两个变量。请注意,此类层次结构可能会导致典型的违反。更彻底地说@didierc的注释:这是一个坏主意。您的类设计有缺陷。@didierc:公平地说,上面的代码段没有设置程序。所以可能没关系…比我快。。。但是它应该是双面的。谢谢,如果矩形类从基类继承字符串,我也可以从Square类继承该字符串吗?设置字符串可能需要更多的工作。你可以有一个受保护的构造函数。请参见编辑。是的,您继承了继承链上的所有内容。嗯,我做的有点不同。。不太确定正确的方法是否。。我只是继承了矩形的长度和宽度,然后是Shape,因为矩形类继承了Shape的公开性。你能展示代码吗[将其编辑到你的问题中,因为在评论中发布代码永远不会成功]。。。