各位大虾,小弟遇到一个棘手的问题关于多继承。在多继承的时候,请教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内到底存了谢什么东东亚?各位大侠,小弟在此谢先拉!

解决方案 »

  1.   

    #include <stdio.h>
    #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的大小的
      

  2.   

    how can I use break point in linux? Thanks
      

  3.   

    这5个类的vtable的大小应该是一样大的
      

  4.   

    vtbl中除了虚函数的指针外,在vtbl的开头还有一部分称为“type_info object"的数据,用来支持RTTI(运行期类型识别),你提到的这个问题在Lippman的“C++对象模型中"说得很清楚,有候杰译的中文版,第9-11页
      

  5.   

    但是这几个类并不支持RTTI,所以这几个类的vtbl中只有虚函数的指针。
      

  6.   

    to 搂主:
        我使用nm -C --print-size来查看vtable的大小的
    这句是什么意思,我用sizeof(***),怎么和你看到的不一样?
      

  7.   

    To Double Jiang,
    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.