C++ 虚函数表

ysuliu 2011-09-07 10:44:44
小弟请教个问题:

虚函数表是每个含有虚函数的类都会有的,那在继承关系中又是怎样呢?

举个例子:

class Base {
public:
virtual void set() {} // 虚函数 set
};

class Derived : public Base {
void set() {} // 继承的虚函数 set
virtual void get() {} // 自有的虚函数 get
};



在这个例子中,子类 Derived 的对象应该有几个虚函数表的指针(vptr)呢?

Base类的对象肯定只能有一个 vptr,看《C++ 对象模型》里面说子类应该完整保持父类的对象结构,也就是Derived类对象肯定会有一个指向Base类虚函数表的指针 vptr, 但是Base类的虚函数表是不包含 Derived::get() 这个虚函数的。。。

哪位给解释一下,虚函数表指针在继承结构中的原理,多谢。。。
...全文
163 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-09-07
  • 打赏
  • 举报
回复
要么你参考拙作:
对象内存布局 (1)
... ...
对象内存布局 (16)

以上文章,是n年前读《Inside C++ Object Model》时,做的读书笔记和相关实验代码。到CSDN上来玩的时候,就把它们加以整理、修改成博客了。

在这些文章里面,俺尽自己的能力,把各种对象的内存布局进行了图示,应该会对问题的理解有些帮助。

如果各位朋友发现有什么错误,欢迎指正。
Enter空格 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhw952 的回复:]
受益菲浅,不过其中一个说法不解:
其实就是个指针,指针长度视操作系统位数而定 //这句应该不一定,应该与实现相关,比如GCC,它在其中加入了偏移,是一个结构,你可以sizeof一下,或者:http://topic.csdn.net/u/20110907/11/c9d76ebc-9b70-48f1-8408-9035ea3f7a68.html

引用 3 楼 mymixing 的回复:
……
[/Quote]
呵,我说的这些话,全是凭经验的。。我没看过多少深奥的书
指针长度视操作系统位数而定,是配合当前操作系统是多少位在在这个操作系统上编写对应的程序而说的。
如果64位操作系统完全支持32位程序的话,我上面那句话也可以无视
Enter空格 2011-09-07
  • 打赏
  • 举报
回复
调用虚函数时,虚函数指针会从本类到父类依次向上查找真实的函数地址。
如果找到了函数实现,就会调用当前函数体执行,如果没找到就继续向上找,最终会找到声明这个虚函数的类这里。
如果这个类仍没有实现体,那编译器就会报错了(反正我刚刚这样试了下,结果如此)。
pathuang68 2011-09-07
  • 打赏
  • 举报
回复
你的理解基本正确。

因此,在lz给出的代码中,用基类的指针无法调用Derived类中自有的虚函数get。

这个问题要说完整很复杂,而且不同的编译器在处理这个问题时稍有不同。
要搞清楚这个问题,还是要看看《Inside C++ Object Model》,这本书讲的是一种比较普遍的实现方法。
jackyjkchen 2011-09-07
  • 打赏
  • 举报
回复
《深入探索C++对象模型》

这个问题只有他讲得清楚
匚匚 2011-09-07
  • 打赏
  • 举报
回复

受益菲浅,不过其中一个说法不解:
其实就是个指针,指针长度视操作系统位数而定 //这句应该不一定,应该与实现相关,比如GCC,它在其中加入了偏移,是一个结构,你可以sizeof一下,或者:http://topic.csdn.net/u/20110907/11/c9d76ebc-9b70-48f1-8408-9035ea3f7a68.html
[Quote=引用 3 楼 mymixing 的回复:]
看毛的这个,那个的,直接自己跑下代码就什么都出来了。
不跑代码光看书一点用都没有。
关于楼主这个问题,所谓虚函数,就是占用了类实例化后"实际对象空间的一个指针"。
子类自有的虚函数是在继承父类虚函数后,继续向下申请的一个函数指针(其实就是个指针,
指针长度视操作系统位数而定)
所以楼主这个子类的虚函数表是这样的。
virtual void set() {}
virtual voi……
[/Quote]
匚匚 2011-09-07
  • 打赏
  • 举报
回复
不知是否与实现有关:在无虚函数覆盖的情况下,虚函数按其声明顺序放于表中,基类虚函数在子类前面,它们在一个虚表中
虚函数表属于类,同一类的实例共享一个虚表,所以虚表不在实例的内存中,但虚表指针在其中.
Enter空格 2011-09-07
  • 打赏
  • 举报
回复
看毛的这个,那个的,直接自己跑下代码就什么都出来了。
不跑代码光看书一点用都没有。
关于楼主这个问题,所谓虚函数,就是占用了类实例化后"实际对象空间的一个指针"。
子类自有的虚函数是在继承父类虚函数后,继续向下申请的一个函数指针(其实就是个指针,
指针长度视操作系统位数而定)
所以楼主这个子类的虚函数表是这样的。
virtual void set() {}
virtual void get() {}
十八道胡同 2011-09-07
  • 打赏
  • 举报
回复
或者: http://www.cnblogs.com/myzone2009/archive/2009/08/24/1552800.html
healer_kx 2011-09-07
  • 打赏
  • 举报
回复
你看看这本书:《深入探索C++对象模型》
http://wenku.baidu.com/view/28b719eae009581b6bd9ebf4.html

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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