我继承了类似这段代码的东西:
class Base
{
public:
virtual double getElement(int i) {return NULL;}
virtual Derived* GetAsDerived() {return this;}
};
class Derived : public Base
{
public:
virtual double getElement(int i) {return vec[i];}
private:
std::vector<double>;
};
功能如下:
void f(Base& b)
{
Derived* d = b.GetAsDerived();
}
程序流程与此类似
Derived A;
/* get data into vector in A */
f(A);
在GetAsDerived()
中调用f
之后.d指向的对象中的向量包含垃圾。在调试器中我可以回到调用堆栈中,看到A中的向量仍然有有效数据。
我确信所有这些奇怪的向上翻译 - 向下倾斜是原因,但我无法在规格或在线找到正式的解释。
那为什么会以这种方式失败呢?
答案 0 :(得分:1)
预测在标准的4.10 / 3中正式定义。向下倾斜是在5.2.9 / 5,虽然这不是你正在做的具体。
解决问题的标题时,不可能将(或返回)基类指针传递给(来自)其参数(返回类型)指示派生类指针的函数。如果参数指示对基类指针的引用,则无法通过引用传递派生类指针。如果是基类指针值,则可以通过隐式转换传递派生指针。
我不能说你的代码失败的原因:如上所述,你的真实代码必须因示例代码的原因而失败,因为你的示例代码根本不起作用。
答案 1 :(得分:0)
在函数f
中,Derived* d = b.GetAsDerived();
不会更改b的任何内容,因此它无法更改b指向的对象,在本例中为A.In f
,If有b = d
或类似的东西,然后A会被更改。