将基础 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
功能可用,以及如何使用它。编译器负责相应地委托给 实现 。
如果我想初始化一个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
功能可用,以及如何使用它。编译器负责相应地委托给 实现 。