我在我的testing.cpp里有这个:
class Supp{
public:
virtual Supp* add(Supp& val) = 0;
};
class SubA : public Supp{
public:
int val;
SubA(int a){
val = a;
}
int getVal(){
return val;
}
Supp* add(Supp& value){
SubA& a = dynamic_cast<SubA&>(value);
int tempVal = a.getVal();
int sum = val + tempVal;
SubA b =SubA(sum);
return &b;
}
};还有那些线
SubA b = SubA(sum); return &b;
提供和错误,因为它将地址返回给一个局部变量,这是非常糟糕的,所以我将它更改为
SubA* b =new SubA(sum); return b;
它工作正常,没有错误,但这不是基本上相同的事情吗?为什么这对编译器是合法的,而以前的版本却不合法?
发布于 2014-04-02 19:43:38
一开始误解了问题,抱歉。
第二种方法之所以有效,是因为您返回的不是引用,而是值。如果签名是
Supp*& add(Supp& value)那么第二个问题也是非法的。
请记住,具有自动存储持续时间的对象在关闭}时会被销毁。因此,函数返回后,对象b不再可访问。它的副本是。如果您按值返回,则原始内容将消失,但您将保留副本。
https://stackoverflow.com/questions/22821372
复制相似问题