各位大虾,小弟遇到一个棘手的问题关于多继承。在多继承的时候,请教vtable的结构是如何的。基类中有一个virtual function,它的大小为12bytes。单一继承时,这个基类的衍生类的大小为12bytes,这里的指针是4bytes,请问另外的8bytes是存储的什么东西,有方法看吗?多继承时,我使用经典的菱形结构(A是基类,B、C从A类继承,D从B、C类继承)。这样,A的vtable大小为12bytes,B、C的vtable大小为20bytes,请问相对单一继承多了什么?D的vtalbe大小为40bytes,请问这个又是多了什么,vtable内到底存了谢什么东东亚?各位大侠,小弟在此谢先拉!
#include <string.h>
#include <sys/mman.h> /*for allowWrite*/
#include <unistd.h> /*for allowWrite*/#include <iostream>using namespace std; class BaseClass {
public:
virtual void print() {
printf("In the BaseClass\n");
}
};class SubClass1:virtual public BaseClass {
public:
void print() {
printf("In the subClass1\n");
}
};class SubClass2:public BaseClass {
public:
void print() {
printf("In in subClass2\n");
}
};class SubClass3:virtual public BaseClass {
public:
void print() {
printf("In the subClass3\n");
}
};class DerivedClass:public SubClass1,public SubClass3 {
public:
void print() {
printf("In the derivedClass\n");
SubClass1::print();
}
};void printVtable ( BaseClass *pa ) {
unsigned * p = (unsigned *)(pa);
int ** vt = (int **)(p[0]);
printf( "vtable address = %p\n",vt);
for(int i=0; i< 1; i++) { /*one virtual functions in MyClass*/
printf("%p %p\n",vt[i],&BaseClass::print);
}}
int main() {
BaseClass baseClassObject;
SubClass1 subClass1Object;
SubClass2 subClass2Object;
SubClass3 subClass3Object;
DerivedClass derivedClassObject;
DerivedClass * derived = &derivedClassObject;
BaseClass * object = &baseClassObject; int i =0; object->print();
printVtable(&baseClassObject); cout<<endl; //test the subclass
cout<<"Testing subclass1"<<endl;
object = &subClass1Object;
i =0; object->print();
printVtable(&subClass1Object); cout<<endl; //test the subclass2
cout<<"Testing subclass2"<<endl;
object = &subClass2Object;
i =0; object->print();
printVtable(&subClass2Object); cout<<endl; //test the subclass3
cout<<"Testing subclass3"<<endl;
object = &subClass3Object;
i =0; object->print();
printVtable(&subClass3Object); cout<<endl; //test the DerivedClass
cout<<"Testing derived class"<<endl;
object = &derivedClassObject;
i =0; object->print();
printVtable(&derivedClassObject); cout<<endl;
return 0;
}我使用nm -C --print-size来查看vtable的大小的
我使用nm -C --print-size来查看vtable的大小的
这句是什么意思,我用sizeof(***),怎么和你看到的不一样?
Because you used "sizeof(***) " for a pointer, you only could know the size of the pointer instead of the vtable. In linux, you can use the "nm" to review the binary code.