指向派生对象的基指针?

时间:2015-02-15 00:05:00

标签: c++ pointers polymorphism

如果Child继承自父母,我会这样做:

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

p的目的是什么?如果Child包含其他数据成员,那么他们会从p继续,只是p无法访问它们吗?

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

1 个答案:

答案 0 :(得分:0)

在显示的微小代码片段中,无法说明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)会丢失。