引用成员变量要考虑的第一件事是您的类(不是Derived,将具有作为指针或引用的数据成员的类Base)是否需要值语义(这是另一种说法,“正确复制和分配”)。
如果是这样,那么引用成员变量或多或少马上就不可能了,因为它们不能被重新安置。在一些奇怪的情况下,无论如何你都可以使用它们,但你不妨假设你不会,并使用指针。
引用数据成员有时对具有“实体语义”的类型很有用(也就是说,它们根本不分配,可能复制也可能不复制),但它们仍然没有给你带来很多好处。它们还可能诱使您误入编写带有const Base&参数的构造函数并将其存储在引用数据成员[*] 中的错误。
谁拥有对象(并负责释放它)完全独立于您使用的是指针还是引用。可能有一个一般约定,不要对你拥有的东西使用引用(并且应该有一个约定,不要对你拥有的东西使用原始指针,你应该选择或编写一个合适的智能指针。智能指针类可以保存一个原始指针)。但这只是惯例。当且仅当你有一个指针时,你不应该假设你管理内存。
总结:使用指针,然后单独决定如何管理内存。
[*] 这是一个错误,因为最终有人会不小心在初始化程序中使用临时对象,然后您的类的实例及其引用数据成员将比临时对象寿命更长。出于这个原因,在返回后存储引用以供使用的东西不应该带const &参数,即使它们不修改对象。他们可以const *取而代之。在 C++11 中,如果还有一个右值引用重载,我想它们可能没问题,以防止const&为临时选择重载,但这不是我尝试过的东西。