当通过引用期望派生的函数传递upcast指针时会发生什么?

时间:2011-02-17 11:54:04

标签: c++ inheritance casting

我继承了类似这段代码的东西:

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中的向量仍然有有效数据。

我确信所有这些奇怪的向上翻译 - 向下倾斜是原因,但我无法在规格或在线找到正式的解释。

那为什么会以这种方式失败呢?

2 个答案:

答案 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会被更改。