使用:“BOOL IsKindOf( const CRuntimeClass* pClass ) const;”来区分。
解决方案 »
- 如何高效地读取内存及硬盘文件?起始地址及读取缓存的对齐问题。
- VC 6.0 ADO数据库添加成员时,出现Runtime Error问题
- 不解!!窗体释放后内存并没有释放??
- 如何利用SendMessage向另一窗口的按钮发送单击的消息?
- 简单问题:如何更改CComboBox的list选项的颜色,在线等,马上结贴
- 一个初级问题,.def文件是用来做什么的
- 如何结束accept()?
- 如何实现图片的透明呢?
- 知道一个窗口的标题名,怎么得到它的句柄,这个窗口是另一个程序的
- 大家救命啊!!好烦的问题啊!!!
- VSS2008中MFC界面调用静态库,程序挂起。。
- 对于任意一段数据,插入一段flag数据,怎么样才能保证正确被检测出来?
谢谢
多谢,我可以把我看的这本书扔掉了,上面尽胡说八道
class A
{
public:
virtual void Function()
{
cout<<"A类函数"<<endl;
}
};class B : public A
{
public:
virtual void Function()
{
cout<<"B类函数"<<endl;
}
};int main()
{
A *p1 = new A;
A *p2 = new A;
A *p3 = new B;
p1->Function();
p2->Function();
p3->Function();
}
this指针调用哪个虚函数,取决于它具体指向什么对象。
实际上对象内部有一个虚表,具体要调用哪个虚函数,this指针在调用时查虚表就知道了。
如上图中p1 p2都是指向A类对象,虚表中Function的地址都是0x1181140
p3指向的是B类对象,虚表中Function的地址就是0x118121c,和p1 p2不一样。
this指针就是靠这个虚表来知道它是指向谁的,该调用那个子类中的虚函数。
自己画张草图吧~如图:
ClassA有若干个虚函数。ClassA继承于Class B ,Class B继承于ClassC等等。
如果ClassA收到消息,并调用virutal fun4, 而该函数按继承关系由父类ClassD,ClassC,Class B 一路继承下来。此时调用的是谁的fun4,则取决于ClassB,ClassC,Class D中哪个最后修改了fun4。比如,ClassB没有修改fun4,而ClassC,Class D都修改了。但调用的是ClassC的fun4。似乎这就是继承和覆盖了吧。
另外,如果把this指向Class B,那么焦点就是Class B的虚函数表了。分析方法也是一样的。
对否
实际上对象内部有一个虚表,具体要调用哪个虚函数,this指针在调用时查虚表就知道了。
如上图中p1 p2都是指向A类对象,虚表中Function的地址都是0x1181140
p3指向的是B类对象,虚表中Function的地址就是0x118121c,和p1 p2不一样。
this指针就是靠这个虚表来知道它是指向谁的,该调用那个子类中的虚函数。