虚函数不解析大多数派生类方法

时间:2013-10-20 11:56:32

标签: c++ debugging object polymorphism

#include <iostream>
using namespace std;

class ShapeTwoD
 { 
   public:
      virtual int get_x(int);




   protected:
    int x;
 };


class Square:public ShapeTwoD
{    
    public:
      void set_x(int,int);

      int get_x(int);





       private:
        int x_coordinate[3];
        int y_coordinate[3];


};

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

s->set_x(0,20);

cout<<s->get_x(0)
    <<endl;




    ShapeTwoD shape[100];

    shape[0] = *s;

cout<<shape->get_x(0); //outputs 100 , it doesn't resolve to 
                           //  most derived function and output 20 also


 }

void Square::set_x(int verticenum,int value)
{
  x_coordinate[verticenum] = value;

}


int Square::get_x(int verticenum)
{
  return this->x_coordinate[verticenum];

}

 int ShapeTwoD::get_x(int verticenum)
 {
   return 100;

 }

shape [0]已初始化为Square。当我打电话给shape-&gt; get_x时,我无法理解 为什么shape-&gt; get_x不会解析为派生类最多,而是解析为基类 形状的类方法 - > get_x。我已经在我的基类中创建了get_x方法virtual。

有人可以向我解释为什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

在这些方面:

ShapeTwoD shape[100];
shape[0] = *s;
你有“切片”。您的shape数组包含ShapeTwoD,并且您从*s分配给第一个ShapeTwoD。这不会更改shape[0]的类型,因此不是类型为Square的对象。多态性只能在使用指针时起作用:

ShapeTwoD* shape[100]; // now you have 100 (uninitialized) pointers
shape[0] = s;

cout << shape[0]->get_x(0);