【问题标题】:Two instances of constructor, different number of parameters构造函数的两个实例,参数数量不同
【发布时间】:2021-09-25 12:23:45
【问题描述】:

我的派生类Square 有问题。正方形的边总是相等的,所以我希望有一种方法可以将它发送到父类 (Rectangle),它不调用默认构造函数,而是提供带有 1 个参数的构造函数。但是,它发现了一个问题,它无法区分默认构造函数和构造函数在长度和宽度相同时的区别。有什么方法可以明确确保 Square 构造函数不调用默认构造函数而不是首选构造函数?

class Rectangle : public Quadrilateral
{
private:
    int length{};
    int width{};

public:
    Rectangle(int len = 1, int wid = 1) : length{ len }, width{ wid }
    {
    }

    Rectangle(int s) : length{ s }, width{ s }
    {
    }

    const int area() { return length * width; }
};

class Square : public Rectangle
{
private:
    int side{};

public:
    Square(int s = 1) : Rectangle{ s }  // Call Rectangle w/ one parameter
    {
    }

    int getSide() const { return side; }

    int perimeter() { return 4 * side; }
};```

【问题讨论】:

  • 值得注意的是,有些人认为从Rectangle继承Square违反了Liskov Substitution Principle
  • 删除Rectangle(int len = 1, int wid = 1)的默认参数。

标签: c++ inheritance constructor


【解决方案1】:

问题在于,当您拥有int 时,有两种方法可以获得Rectangle。一种是以wid为默认1调用第一个构造函数,另一种是调用单参数构造函数。

我认为这是对参数使用默认值的结果。如果您需要默认值,我会说只需对函数进行另一个重载,该函数接受更少的参数并将调用转发给另一个函数,并传递默认值。这样,您会很快注意到您有两个具有完全相同签名的重载(取一个 int)。

你要么:

  • 下定决心,决定Rectangle(int) 的含义(要么只是length,默认width,要么同时是lengthwidth
  • Square(int) 中首先使用两个参数调用Rectangle 构造函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2020-10-19
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2023-03-02
    • 1970-01-01
    相关资源
    最近更新 更多