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

C++ inherit from a concrete class to another concrete class

本文关键字:继承 另一个 一个 C++      更新时间:2023-10-16

我正试图从我的类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相等,那么我可以返回Square的Area和Perimeter。。

从现有类继承是非常好的。

然而,你可能想要的是:

 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") {}
};

第二版:我想出的代码:

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

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

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

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

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

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

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

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