,问一个类中虚函数的有关问题.
各位高手,问一个类中虚函数的问题..........
//Fly()是virtual
//Horse为基类,Pegasus为派生类
-------------------------------------------
Horse *pHorse = new Horse;
pHorse->Fly(); //将调用Horse类中的F函数
Horse *pHorse = new Pegasus;
pHorse->Fly(); //将调用Pegasus类中的F函数
------------------------------------------
(在Horse *pHorse = new Pegasus; 前提下)
书上有句话:
编译器知道pHorse是一个Horse指针,因此在Horse类中查找Fly()函数.
由于Fly()是一个虚函数,因此将调用Pegasus类中的Fly()函数.
(在Horse *pHorse = new Horse; 前提下)
这个Horse指针还是会去Horse类中查找Fly()函数.
但是,这次它并没有因为Fly()是虚函数就去Pegasus中调用Fly().
那说白了,在virtual的前提下,调用哪个,关键就是看new 是在那个类中申请了一块内存?
对吗?
------解决方案--------------------
那说白了,在virtual的前提下,调用哪个,关键就是看new 是在那个类中申请了一块内存?
对吗?
--------------------------
不对,在有些情况下,即使new Pegasus,也不一定会调用Pegasus的fly。
因为虚函数是根据动态类型进行解析的,而解析的方法是最终覆盖者final overrider,但overrider不一定是new的那个类的虚拟函数。
------解决方案--------------------
有虚函数的类会有一个隐藏成员叫虚函数表指针,它指向一个虚函数表,里面都是虚函数的函数指针。
对于这种类,new的时候会把虚函数表指针赋值为new的那个类对应的虚函数表的地址。也就是说,究竟调用什么函数全在于new后面的类。
不过这个不叫也根本不是“是在那个类中申请了一块内存”,这叫“对象是用哪个子类实例化的”。
//Fly()是virtual
//Horse为基类,Pegasus为派生类
-------------------------------------------
Horse *pHorse = new Horse;
pHorse->Fly(); //将调用Horse类中的F函数
Horse *pHorse = new Pegasus;
pHorse->Fly(); //将调用Pegasus类中的F函数
------------------------------------------
(在Horse *pHorse = new Pegasus; 前提下)
书上有句话:
编译器知道pHorse是一个Horse指针,因此在Horse类中查找Fly()函数.
由于Fly()是一个虚函数,因此将调用Pegasus类中的Fly()函数.
(在Horse *pHorse = new Horse; 前提下)
这个Horse指针还是会去Horse类中查找Fly()函数.
但是,这次它并没有因为Fly()是虚函数就去Pegasus中调用Fly().
那说白了,在virtual的前提下,调用哪个,关键就是看new 是在那个类中申请了一块内存?
对吗?
------解决方案--------------------
那说白了,在virtual的前提下,调用哪个,关键就是看new 是在那个类中申请了一块内存?
对吗?
--------------------------
不对,在有些情况下,即使new Pegasus,也不一定会调用Pegasus的fly。
因为虚函数是根据动态类型进行解析的,而解析的方法是最终覆盖者final overrider,但overrider不一定是new的那个类的虚拟函数。
------解决方案--------------------
有虚函数的类会有一个隐藏成员叫虚函数表指针,它指向一个虚函数表,里面都是虚函数的函数指针。
对于这种类,new的时候会把虚函数表指针赋值为new的那个类对应的虚函数表的地址。也就是说,究竟调用什么函数全在于new后面的类。
不过这个不叫也根本不是“是在那个类中申请了一块内存”,这叫“对象是用哪个子类实例化的”。