请讲讲early binding
有如下小程序:
#include<iostream.h>
class CA
{
public:
void display();
};
void CA::display()
{
cout<<"in CA"<<endl;
}
class CB : public CA
{
public:
void display();
};
void CB::display()
{
cout<<"in CB"<<endl;
}
void main()
{
CB b;
CA* pA=&b;
pA->display();
cout<<sizeof(b)<<endl;
}
毫无疑问,程序将输出in CA
书上都是大概的讲一下:“编译器在只有b的地址时它并不知道正确的调用函数。”那么,pA指向b,当用pA调用display时,这个调用是指针的偏移实现的吧。那么为什么指不到b的display呢?关于虚函数我也理解,VP,VTABLE。但就是不明白,请指教。
还有,sizeof(b)输出1,这个1是什么?函数的入口地址?还是没其他意思仅仅表示b是存在的?
问题点数:80、回复次数:5Top
1 楼kalling(kalling)回复于 2001-05-25 20:23:00 得分 80
事实上,类的成员函数(非virtual)是单独放在内存中的,与类的对象实体分开,没有什么偏移的事
编译时,
CA::display()函数的定义将变成诸如 CA_display( CA * pA);就是普通的C函数
pA->display(); 调用将变成调用 CA_display( pA ); 为什么不调用CB,是因为pA类型是CA *
只有虚函数调用时才用到指针偏移Top
2 楼magicblue(小飞侠)回复于 2001-05-25 21:30:00 得分 0
明白了,那第二个问题能给我讲讲吗Top
3 楼magicblue(小飞侠)回复于 2001-05-26 09:08:00 得分 0
UPTop
4 楼magicblue(小飞侠)回复于 2001-05-26 14:27:00 得分 0
再推一下Top
5 楼magicblue(小飞侠)回复于 2001-05-27 09:30:00 得分 0
last upTop




