我发现无论什么时候我们需要多态,我们都需要指针或引用,因为在Derived
变量' slice'中存储Base
个实例。关闭在' Base'。
(我想这是因为Derived
和Base
个实例并不一定占用内存中的相同空间。这是正确的吗?)
因此,当我们想要一个容纳所有类型对象的容器时,所有对象都来自Base
的子类,我们需要一个指针容器而不是实际对象的容器。
如果我们想要一个从这个容器中获取对象并返回它的函数,那么它就是' (没有切片),我们可以这样做:
Base* get_pointer(int index) {
return container[index];
}
但是我想要做以下事情:
Base get_object(int index) {
return *container[index];
}
即:返回一个真实的对象,而不是一个指针。这可能吗?或者,当我想要任何类型的多态时,我是否应该总是使用指针进行管理?
答案 0 :(得分:3)
我知道每当我们想要多态时,我们需要指针或引用[...]这是正确的吗?
这是绝对正确的。但是,您不仅限于语言中内置的“普通”指针。智能指针(例如std::unique_ptr<T>
和std::shared_ptr<T>
)提供了一种更好的替代方法,可以保护多态行为。
[我想]返回一个真实的对象,而不是一个指针。这可能吗?
你可以这样做,但切片会回来。 Base
将按值返回,因此结果将被剥离派生的功能。当你按值传递或返回时总会发生这种情况(传递和返回是同一事物的两个方面,因此在两种情况下,基本机制都是相同的)。
但是,如果您通过引用返回Base&
,那么您将在调用者中获得相同的语法,并且您的对象不会被切片:
Base& get_object(int index) {
return *container[index];
}
唯一的问题是,当您的代码持有对它的引用时,容器中的项必须保留在原位。
答案 1 :(得分:0)
正如您已经提到的,在许多需要多态的面向对象的Progtramming语言中,指向[dynamic allocated]对象的指针用于访问派生成员,而不是普通[静态分配]对象。
但是,在C ++中,正如其他人所提到的那样,您也可以选择使用引用,而其他编程语言则没有它,并且必须坚持使用指针。
您在示例中提到了“数据收集或数据容器”。许多需要大量数量的软件。对象(例如数据结构),而不是使用指向对象的指针,以最大化内存使用。
就个人而言,我更喜欢使用指针而不是引用,不仅仅是为了访问派生成员,而且还有前面解释过的原因。