多继承vtable的问题

sx7cn 2003-07-07 11:39:55
各位大虾,小弟遇到一个棘手的问题关于多继承。在多继承的时候,请教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内到底存了谢什么东东亚?

各位大侠,小弟在此谢先拉!
...全文
91 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
syl08341 2003-07-09
  • 打赏
  • 举报
回复
:
sx7cn 2003-07-09
  • 打赏
  • 举报
回复
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.
MyNameEPC 2003-07-09
  • 打赏
  • 举报
回复
关于如何实现多态,各个编译器是不一定是一样的!!!
DoubleJiang 2003-07-09
  • 打赏
  • 举报
回复
to 搂主:
我使用nm -C --print-size来查看vtable的大小的
这句是什么意思,我用sizeof(***),怎么和你看到的不一样?
hwonzor 2003-07-09
  • 打赏
  • 举报
回复
但是这几个类并不支持RTTI,所以这几个类的vtbl中只有虚函数的指针。
ttzzgg_80713 2003-07-08
  • 打赏
  • 举报
回复
不知你的多继承是怎么写的。请列出来。
bluedodo 2003-07-08
  • 打赏
  • 举报
回复
看样子是要高手来解答了
cy214 2003-07-08
  • 打赏
  • 举报
回复
mark
__________________ 2003-07-08
  • 打赏
  • 举报
回复
设断点。看虚函数表。
winmainII 2003-07-08
  • 打赏
  • 举报
回复
vtbl中除了虚函数的指针外,在vtbl的开头还有一部分称为“type_info object"的数据,用来支持RTTI(运行期类型识别),你提到的这个问题在Lippman的“C++对象模型中"说得很清楚,有候杰译的中文版,第9-11页
hwonzor 2003-07-08
  • 打赏
  • 举报
回复
这5个类的vtable的大小应该是一样大的
sx7cn 2003-07-08
  • 打赏
  • 举报
回复
how can I use break point in linux? Thanks
sx7cn 2003-07-08
  • 打赏
  • 举报
回复
#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的大小的

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧