为什么静态内存不显示多态性?

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

上执行多态性