在派生类中增加新的虚函数
请讲讲为什么编译器防止对只在派生类中存在的函数做虚函数调用 问题点数:50、回复次数:8Top
1 楼lj9852(Loading)回复于 2001-05-01 14:50:00 得分 20
在派生类中,各个虚函数在vtable中的位置跟基类的vtable是一样的,编译器在vtable中是通过
偏移地址来选择虚函数的,不论对象属于哪个特殊的类,对虚函数的调用总是使用相同的方法,比
如基类中只有一个虚函数,那它就是编译器唯一允许调用的。通过基类指针调用虚函数时,编译器
要通过vtable才知道自己将要对哪个对象进行操作,如果在其派生类中再声明一个虚函数,就会
引起该派生类的vtable和基类的不一致,可能会产生调用混乱。如果一定要调用该子类中的函数,
则必须显式地指明。
浅薄见解,请高手指正Top
2 楼cnss(飞碟)回复于 2001-05-01 20:54:00 得分 0
听课Top
3 楼Nicrosoft(奈软)回复于 2001-05-01 20:56:00 得分 0
长见识Top
4 楼cber(cber)回复于 2001-05-01 21:02:00 得分 25
好问题,这个问题的答案不是一时半会能讲完的。反正你只要记住一件事,那就是千万不要在派生类中随意地引入虚函数。如果引入的话,请千万不要在多态中用这个派生类的父类指针来对这个虚函数进行调用。因为在进行function call resolution时会通不过的。
C++在进行function call resolution时只考虑函数的可见性,不考虑运行时到底调用哪个函数实体,这个动作是在运行时决定的,实现的机制就是vtable,这就是所谓的动态绑定的由来。
如果要想知道更多,可以看一看inside c++ object model,要么写mail给我,具体的情况写起来比较多,我以后再详细叙述。Top
5 楼magicblue(小飞侠)回复于 2001-05-01 21:52:00 得分 0
这是不是可以说是VTABLE的映射问题,这种向下映射是不安全的。
谢谢各位的回复Top
6 楼lj9852(Loading)回复于 2001-05-01 22:18:00 得分 0
to cber(cber):如果可能的话还麻烦你对虚函数和多态作些总结,我代表菜鸟谢了先!Top
7 楼oliverluoy(大飞)回复于 2001-05-01 22:42:00 得分 0
对于多态的编程不利!!!!Top
8 楼Nicrosoft(奈软)回复于 2001-05-01 22:52:00 得分 5
虚函数可以参考:http://www.csdn.net/expert/topic/110/110307.shtmTop




