为什么静态内存不显示多态性?
Why static memory not showing Polymorphism?
我做了两个简单的类多边形和三角形。 (Triangle继承自Polygon,都有virtual Draw()函数)
调用代码很简单:
void main()
{
Polygon *p_t = new Triangle();
Polygon p_tStatic;
Triangle t;
p_tStatic = t;
cout<<"Calling Dynamic Allocated Memory's Draw():"<<endl;
p_t->Draw();
cout<<"Calling Static Allocated Memory's Draw():"<<endl;
p_tStatic.Draw();
_getch();
}
输出为:
我知道很多人会认为这是一个研究较少且天真的问题,但我想知道的是为什么它在后一种情况下表现出 Non-Polymorphic 行为。为什么我们不能为静态内存做到这一点?
p_tStatic
是,而且永远是 Polygon
。这不是 Triangle
.
对象在构造后不能更改类型。
考虑程序的两个阶段;首先是编译,然后是 运行 时间,如果你没有将变量声明为引用或指针,它的类型在编译期间已经确定为 Polygon
,并且它的成员函数被调用。为了受益于发生在 运行 期间的动态绑定(当您实际 运行 程序时),您需要通过指针或引用来调用您的对象。
正如上面的答案所指出的,从静态内存创建的对象永远不会改变它的类型;无论是编译还是 运行 时间。三角形是一个多边形,所以多边形只得到适合多边形的三角形部分(即对象切片),因此我们不能在 运行time
上执行多态性
我做了两个简单的类多边形和三角形。 (Triangle继承自Polygon,都有virtual Draw()函数)
调用代码很简单:
void main()
{
Polygon *p_t = new Triangle();
Polygon p_tStatic;
Triangle t;
p_tStatic = t;
cout<<"Calling Dynamic Allocated Memory's Draw():"<<endl;
p_t->Draw();
cout<<"Calling Static Allocated Memory's Draw():"<<endl;
p_tStatic.Draw();
_getch();
}
输出为:
我知道很多人会认为这是一个研究较少且天真的问题,但我想知道的是为什么它在后一种情况下表现出 Non-Polymorphic 行为。为什么我们不能为静态内存做到这一点?
p_tStatic
是,而且永远是 Polygon
。这不是 Triangle
.
对象在构造后不能更改类型。
考虑程序的两个阶段;首先是编译,然后是 运行 时间,如果你没有将变量声明为引用或指针,它的类型在编译期间已经确定为 Polygon
,并且它的成员函数被调用。为了受益于发生在 运行 期间的动态绑定(当您实际 运行 程序时),您需要通过指针或引用来调用您的对象。
正如上面的答案所指出的,从静态内存创建的对象永远不会改变它的类型;无论是编译还是 运行 时间。三角形是一个多边形,所以多边形只得到适合多边形的三角形部分(即对象切片),因此我们不能在 运行time
上执行多态性