C++ 包含对抽象类类型的引用的结构

C++ 包含对抽象类类型的引用的结构,c++,arrays,pointers,vector,abstract,C++,Arrays,Pointers,Vector,Abstract,基于这个问题,我想问一下,当有人想要创建抽象类的引用结构时,有哪些可能的方法可用。之后,它被不同的对象填充,这些对象的类显然是从同一个基派生的。这种结构也必须在作为参数传递的不同类的函数内部“传递” 我遵循了链接问题中提出的策略(这当然是有缺陷的),因为我不能声明抽象类的对象数组。但是,这可以通过指针数组实现。这可以在不使用以下指针的情况下使用向量来完成: vector<Square> allSquares; vectoralsquares; ??如果向量本身通过引用(&allS

基于这个问题,我想问一下,当有人想要创建抽象类的引用结构时,有哪些可能的方法可用。之后,它被不同的对象填充,这些对象的类显然是从同一个基派生的。这种结构也必须在作为参数传递的不同类的函数内部“传递”

我遵循了链接问题中提出的策略(这当然是有缺陷的),因为我不能声明抽象类的对象数组。但是,这可以通过指针数组实现。这可以在不使用以下指针的情况下使用向量来完成:

vector<Square> allSquares;
vectoralsquares;

??如果向量本身通过引用(&allSquares)传递,那么这种情况下的引用是否在任何地方都保留其初始地址

是的,有一个抽象类型的数组很好,它通常非常方便,但您可能需要一个指针数组,即:

vector<Square*> allSquares;
vectoralsquares;

而不是简单地对象本身,因为每个类型的大小可以变化,但是C++指针在大小上是不变的,即,32位系统上的C++指针被存储为INT.< /P> < P>不能通过值传递或保存抽象对象,您可以得到切片。基本上,您会丢失所有数据。您必须通过引用、指针或智能指针(共享)来存储它们

到目前为止,最简单的方法是将所有抽象对象作为共享的ptr进行管理。这样你就不必处理人生中的复杂问题。当对象不再需要时,它们将删除自己

下面是使用此方法的示例语法

std::vector<boost::shared_ptr<Shape> > shapes;
shapes.push_back(boost::make_shared<Rect>());

boost::shared_ptr<Shape> foo = shapes[0];
foo->draw(); //Draws the rectangle.
std::向量形状;
shapes.push_back(boost::make_shared());
boost::shared_ptr foo=shapes[0];
foo->draw()//绘制矩形。
A
vector
包含
Square
本身的实际实例,而不是它的任何子类。(C++只支持通过指针的多态性,而不支持通过值的多态性。)由于
Square
是一个抽象类,因此
Square
本身不可能有实例,因此
向量
基本上没有意义。您需要使用
向量

或boost::ptr\u向量。ptr_向量拥有所有包含指针的所有权。它的接口还返回对对象(而不是指针)的引用,因此更容易与标准算法一起使用(因为您不需要双重反引用迭代器)。