我对引用理解起来非常困难。请考虑以下代码:
class Animal
{
public:
virtual void makeSound() {cout << "rawr" << endl;}
};
class Dog : public Animal
{
public:
virtual void makeSound() {cout << "bark" << endl;}
};
Animal* pFunc()
{
return new Dog();
}
Animal& rFunc()
{
return *(new Dog());
}
Animal vFunc()
{
return Dog();
}
int main()
{
Animal* p = pFunc();
p->makeSound();
Animal& r1 = rFunc();
r1.makeSound();
Animal r2 = rFunc();
r2.makeSound();
Animal v = vFunc();
v.makeSound();
}
结果是:"bark bark rawr rawr"。
从Java的思维方式来看(这显然已经影响了我对C ++的概念),结果将是"bark bark bark bark"。我从上一个问题中了解到,这种差异是由于切片引起的,现在我很好地理解了什么是切片。
但假设我想要一个返回真正是狗的动物值的函数。
- 我是否正确理解,我能得到的最接近的是一个引用?
- 此外,使用rFunc接口的人是否有责任确保返回的引用被分配给Animal&?(或者有意将引用分配给通过切片丢弃多态性的Animal。)
- 我应该如何返回对新生成的对象的引用,而不是像rFunc中所做的愚蠢之举?(至少我听说过这很愚蠢。)
更新:由于大家似乎都认为rFunc是不合法的,那么就会引出另一个相关问题:
如果我传回一个指针,如何告诉程序员如果这样的情况发生,该指针不属于他们删除?或者,如果该指针随时可能被删除(来自同一线程但不同函数),如何通知调用函数不应存储它?这种情况下,唯一的沟通方式是通过注释吗?那似乎有些粗糙。
注意:所有这些都是为了我正在开发的一个模板化shared_pimpl概念。希望几天后能学到足够多的知识,发布一些相关内容。