#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。
有人可以向我解释为什么以及如何解决这个问题?
答案 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);