我在理解参考资料方面遇到了麻烦。考虑以下代码:
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”。我从之前的问题中了解到,这种差异是由于切片造成的,我现在对切片是什么有了很好的理解。
但是,假设我想要一个返回真正是 Dog 的 Animal 值的函数。
- 我是否正确理解我能得到的最接近的是参考?
- 此外,使用 rFunc 接口的人是否有责任看到返回的引用是分配一个 Animal&?(或者以其他方式故意将引用分配给通过切片丢弃多态性的 Animal。)
- 我到底应该如何返回对新生成对象的引用而不做我上面在 rFunc 中所做的愚蠢事情?(至少我听说这很愚蠢。)
更新:由于到目前为止每个人似乎都同意 rFunc 它是非法的,这带来了另一个相关的问题:
如果我传回一个指针,如果是这种情况,我如何与程序员沟通该指针不是他们要删除的?或者,我如何传达指针随时可能被删除(来自同一个线程但不同的函数),以便调用函数不应该存储它,如果是这种情况。是通过评论传达这一点的唯一方法吗?这似乎很草率。
注意:所有这些都导致了我正在研究的模板化 shared_pimpl 概念的想法。希望我能在几天内学到足够的东西来发布一些关于它的东西。