0

我有 2 个课程:ShapeTwoD 和 Square。Square 派生自 ShapeTwoD。

class ShapeTwoD
 { 
   public:virtual int get_x()
          { return x;}

          void set_x(int x)
          {x = x; }

   private:
        int x;
 };


class Square:public ShapeTwoD
{    
    public:
          virtual int get_x()
          { return x+5; }

    private:
           int x;

};

在我的主程序中

int main()
{
 Square* s = new Square;

s->set_x(2);

cout<<s->get_x()  //output : 1381978708 when i am expecting 2
    <<endl;




ShapeTwoD shape[100];

shape[0] = *s;

cout<<shape->get_x(); //output always changes when i am expecting 2


}

我得到的控制台输出很奇怪。

第一个输出是 1381978708 虽然我希望它是 2 。

第二个输出总是改变,虽然我也期望它是 7

我正在尝试使用虚函数来解析最派生的类方法,有人可以向我解释发生了什么吗???

4

3 回答 3

1

这是因为每个类都有不同的x成员。因此,当您调用时,s->set_x(2)您将其设置在ShapeTwoD对象的一部分中,同时Square::get_x从对象的Square一部分中获取它。

从类中删除成员变量Square,并使成员变量处于ShapeTwoD受保护状态。

于 2013-10-20T11:08:51.333 回答
1

看一下代码中的注释:

class ShapeTwoD
{ 
public:
    virtual int get_x()
    {
        return x; // outputs ShapeTwoD::x
    }

    void set_x(int x)
    {
        // x = x;   // sets x to x
        this->x = x // sets ShapeTwoD::x
    }

   private:
        int x;
 };


class Square:public ShapeTwoD
{    
public:
    virtual int get_x()
    {
        return x + 5; // Outputs Square::x
    }

private:
    int x;
};

int main()
{
    Square* s = new Square;

    s->set_x(2);

    cout<<s->get_x()  //output : 1381978708 when i am expecting 2
        <<endl;       // because Square::x is uninitialized

    ShapeTwoD shape[100];

    shape[0] = *s; // slices Square to ShapeTwoD

    cout<<shape->get_x(); //output always changes when i am expecting 2
                          // look at the comments to the set_x function
}

因此,因为在中x声明为private,所以无法访问它。你所要做的:ShapeTwoDSquare

  1. 使x保护在ShapeTwoD
  2. x从中删除Square
  3. 更改x = x为(或将成员变量重命名set_x为)this->x = x_x
于 2013-10-20T11:15:26.230 回答
0

您不需要第二个在派生类的虚拟方法中x隐藏基类,只需使用x

class Square:public ShapeTwoD
{    
public:
      virtual int get_x()
      { return x+5; }
};

在您的原始代码中,当 setter from正在设置时Square::get_x()引用。Square::xShapeTwoDShapeTwoD::x

此外,setter 本身是错误的,你想要:

void set_x(int x)
{
    this->x = x;
}
于 2013-10-20T11:08:40.137 回答