((sub*)p)->test();//输出结果是i am sub,为什么base类的test加上virtual,结果就是i am base?解决方案

((sub*)p)->test();//输出结果是i am sub,为什么base类的test加上virtual,结果就是i am base?
C/C++ code

#include <iostream>
using namespace std;

class base{
public:
     void test()
     {
              cout<<"i am base"<<endl;
    }
};

class sub:public base{
public:
      void test()
      {
            cout<<"i am sub"<<endl;
      }
};

int main()
{
        base* p = new base;
       ((sub*)p)->test();
}



------解决方案--------------------
第一:子类指针不能执行父类 你想 苹果是水果,能说水果就是苹果吗?
第二:如果父类的test函数不声明为虚函数的话,程序内部不存在虚函数表,属于静态联编。就直接调用子类重载test函数
而加了virtual关键字后父类的test就被说明成了虚函数,程序运行时就会建立虚函数表,属于动态联编,所以调用了虚函数表内的函数,也就是父类的test函数

今天刚理解的,不是很清楚 请各位指导