((sub*)p)->test();//输出结果是i am sub,为什么base类的test加上virtual,结果就是i am base?解决方案
((sub*)p)->test();//输出结果是i am sub,为什么base类的test加上virtual,结果就是i am base?
------解决方案--------------------
第一:子类指针不能执行父类 你想 苹果是水果,能说水果就是苹果吗?
第二:如果父类的test函数不声明为虚函数的话,程序内部不存在虚函数表,属于静态联编。就直接调用子类重载test函数
而加了virtual关键字后父类的test就被说明成了虚函数,程序运行时就会建立虚函数表,属于动态联编,所以调用了虚函数表内的函数,也就是父类的test函数
今天刚理解的,不是很清楚 请各位指导
- 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函数
今天刚理解的,不是很清楚 请各位指导