将基础 class 对象初始化为派生 class 对象有什么意义

What is the point of initializing a base class object as a derived class object

如果我想初始化一个classSquare

class Square : public Rectangle {
    public Square(int length)
    {
        this->length = length;
        this->width = length;
    }
}

源自 class Rectangle

class Rectangle {
    protected int length, width;

    public Rectangle(int length, int width)
    {
        this->length = length;
        this->width = width;
    }

    public int getArea() { return length * width; }
}

我会的

Square * s = new Square(5);
cout << s->getArea() << endl;

这样做有什么好处

Rectangle * r = new Square(5);
cout << r->getArea() << endl;

而是将对象初始化为基础 class 对象?

您有一个接口和该接口的实现。这是 继承多态性 如何协同工作的一部分。

Rectangle *r = new Square 仅在 Square 派生自 Rectangle 时有效。任何作为 Rectangle 后代的对象都可以分配给 Rectangle* 指针。

假设您的代码只需要一个 Rectangle* 指针来完成它的工作。代码不需要关心它是否对内存中的 Square 对象进行操作。也许您必须根据 运行 时的用户输入或某些业务规则等做出该决定。多态性允许这样做。 接口确保所需的Rectangle功能可用,以及如何使用它。编译器负责相应地委托给 实现