为什么有一个引用数组没有意义,我怎么能有一个多态对象数组,没有指针?

时间:2014-10-06 13:01:03

标签: c++ arrays pointers reference polymorphism

在C ++中,拥有引用数组是非法的。在question about it中,第二个投票的答案声称"参考不是对象。他们没有自己的存储空间,只是引用现有的对象。因此,拥有引用数组是没有意义的。"。

首先,我想了解为什么拥有一系列参考文献是没有意义的。

我为什么会这样做的假设是,在使用参考的任何地方,它都会自动被翻译成#39;它引用的对象。所以说arrayOfReferences[5] = refToObj等同于说arrayOfReferences[5] = objresToObj始终隐式翻译为obj。因此,创建一个对象的引用数组,相当于简单地创建一个对象数组。这个假设是否正确?

如果是,那么我还有另一个问题:

在C ++中,如果我们想要多态,我们可以使用指针或引用。在Thing中存储Thing*子类的对象允许我们使用多态,因此将其存储在Thing&中。但是将其存储在Thing'切片中。额外的非Thing内容,并为我们留下了简单的Thing

因此,如果我们同意一个引用数组相当于一个对象数组 - 很好,我可以使用一个普通的对象数组。但是 - 我失去了多态性。我可以在Thing中存储各种Thing[]个对象,但它们都会被切成简单的Thing

所以,第二个问题是:有没有办法将对象存储在数组中并保留其具体类型和多态,而不使用指针(即Thing*[])?

4 个答案:

答案 0 :(得分:0)

  

有没有办法在数组中存储对象并保留其具体类型和多态性,而不使用指针(即Thing * [])?

是(但不是直接)。看看this(免责声明:该链接指向我自己的帖子之一)。该帖子提出了一个包装引用的类(类似于std :: reference_wrapper),它也为引用的对象实现了深层复制语义。

答案 1 :(得分:0)

答案是肯定和否定,让我详细说明。

首先,引用不像对象本身,它们实际上就像具有更好语法的指针。 因此,引用数组将等同于指针数组。

其次你应该明白这不是关于数组或指针,而是关于类型的术语:

  

有没有办法......保留其具体类型和多态性

在此上下文中(C ++)(动态)多态性意味着具体类型已知结。只有接口是已知的,它的实现因不同的子类型而异。这是实现多态的方法。因此,使用具体类型将不允许多态。

那就是说你可以用“聪明的引用”形式自己实现“智能指针”并将它们的值存储在一个数组中,比如类型

CleverReference<IThing>[]

检查std :: unique_ptr / std :: shared_ptr并查看Jeff Elgers的“隐形指针”

答案 2 :(得分:0)

根据C ++ ISO定义,不应引用引用,不引用引用数组,也不引用引用指针。

http://en.wikipedia.org/wiki/Reference_(C%2B%2B)#ISO_definition

不应引用引用no arrays of references,也不引用引用。引用的声明应包含初始值设定项(8.5.3),除非声明包含显式的extern说明符(7.1.1),是类声明中的类成员(9.2)声明,或者是参数的声明或返回类型(8.3.5);见3.1。应初始化引用以引用有效的对象或函数。 [注意:特别是,在一个定义良好的程序中不能存在空引用,因为创建这样一个引用的唯一方法是将它绑定到通过解除引用空指针获得的“对象”,这会导致未定义的行为。如9.6中所述,引用不能直接绑定到位域。 ] -ISO / IEC 14882:1998(E),ISO C ++标准,见8.3.2节[dcl.ref]

答案 3 :(得分:0)

让我成为第一个建议您使用智能指针的人。这是一个让你入门的例子:

std::vector<std::unique_ptr<Thing>> v;

v.push_back(std::make_unique<NumberThing>(42));
v.push_back(std::make_unique<StringThing>("hello"));

for (auto&& thing : v)
{
    thing->doYourThing();
}

请注意,此处完全没有newdelete,系统会为您完成所有工作。