指向派生对象的基指针

Base pointer to derived object?

本文关键字:指针 对象 派生      更新时间:2023-10-16

如果Child从父级继承,并且我继承:

Child* c = new Child();
Parent* p = c;

p的目的是什么?如果Child包含额外的数据成员,那么它们是否继承了p,只是p无法访问它们?

我试图理解内存中的实际内容和指针可以访问的内容之间的区别,这取决于它的静态类型。

在显示的一小段代码中,无法判断p的用途。然而,通常情况下,使用对基类的指针或引用来存储本质上多态的对象是一种常见的做法。例如,形状的经典示例:

// Base class for all shapes. 
class Shape
{
  ... 
};
class Circle: public Shape
{
  ...
};
class Square: public Shape
{
  ...
};

现在,如果我们想存储一堆形状,我们可以使用:

std::vector<Shape*> shapes;
shapes.push_back(new Circle);
shapes.push_back(new Square);

然后做:

for(auto &s : shapes)
{
   s.Draw();    // Draw shapes on screen... 
}

向量需要包含指针或引用,以便由存储的实际对象来确定类型。如果我们制作一个向量std::vector<Shape> shapes,那么我们将得到"切片",其中存储在Circle(如radius)或Square(如side)中的任何额外信息都将丢失。