在构造函数初始化时,会初始化一张虚表(所以构造函数不能为虚函数),这张表存放了虚函数的入口地址。如果派生类未实现基类的虚函数fun,则虚表中将存放基类中fun的入口地址,反之则存放派生类中的fun的入口地址。而析构函数一般推荐为虚函数,原因是当B派生自A类时,A* a = new B时,delete a;应该要执行A,B的析构
这个虚指针一般放在类对象的尾端,这样可以保留基类C结构体的对象布局,也就是兼容C,但据说VC++编译器则放在前端,并且它使用虚函数表,如果一个类有一个或多个虚基类,就会由编译器安插一个指针,指向虚函数表,至于真正的虚基类指针当然也是在表格中的.
其它编译器有的在虚函数表中放置虚函数的offset,将虚基类offset和虚函数实体混在一起,有些编译器(sun)虚函数表可以由正负值来索引,正值索引到虚函数,负值索引到虚函数offset
1.每一个类产生出一堆指向虚函数的指针,放在虚函数表中
2.每一个类对象被安插一个虚指针,指向相关的虚函数表.虚指针的设定和重置都由每一个类的构造函数,析构函数和拷贝构造函数自动完成.每一个类所关联的type_info object也经由虚函数表被指出来,通常放在虚函数表的第一个slot
这个虚指针一般放在类对象的尾端,这样可以保留基类C结构体的对象布局,也就是兼容C,但据说VC++编译器则放在前端,并且它使用虚函数表,如果一个类有一个或多个虚基类,就会由编译器安插一个指针,指向虚函数表,至于真正的虚基类指针当然也是在表格中的.
其它编译器有的在虚函数表中放置虚函数的offset,将虚基类offset和虚函数实体混在一起,有些编译器(sun)虚函数表可以由正负值来索引,正值索引到虚函数,负值索引到虚函数offset
1.每一个类产生出一堆指向虚函数的指针,放在虚函数表中
2.每一个类对象被安插一个虚指针,指向相关的虚函数表.虚指针的设定和重置都由每一个类的构造函数,析构函数和拷贝构造函数自动完成.每一个类所关联的type_info object也经由虚函数表被指出来,通常放在虚函数表的第一个slot