关于虚函数中,构建成虚函数表之后,如何调用父类函数

nevermorewish 2013-05-15 03:32:08
class B
{
public:
virtual void f()
{
cout << "B::f()" << endl;
}
};
class B1 : public B
{
public:
virtual void f()
{
B::f(); //这个是如何取到地址的?
cout << "B1::f()" << endl;
}
};

如上代码中 会输出 B::f()和B1::f()
但是我看完了《虚函数解析》之后,认为子类的虚函数会直接覆盖父类的虚函数
在整个子类虚函数表中已经找不到 被覆盖的父类函数了
那么上述 B;;f()代码是如何寻址的呢?
...全文
387 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
adaLyx 2014-06-11
  • 打赏
  • 举报
回复
看不下去了。
赵4老师 2013-05-16
  • 打赏
  • 举报
回复
我个人是喜欢F11键比看书多一些,如果你喜欢看书比F11键多一些的话,推荐 《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
赵4老师 2013-05-16
  • 打赏
  • 举报
回复
接着按F11键啊。
nevermorewish 2013-05-16
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 cai6811376 的回复:]
[quote=引用 2 楼 zhao4zhong1 的回复:]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

你回这个有什么意思呢?c++版第一水王[/quote]
“任意门”在此,可是很多人不愿意进!爱莫能助!![/quote]



从上面的汇编代码就能看的出来,B::f()就是取的地址么?
赵4老师 2013-05-16
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
赵4老师 2013-05-16
  • 打赏
  • 举报
回复
引用 5 楼 cai6811376 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
你回这个有什么意思呢?c++版第一水王[/quote] “任意门”在此,可是很多人不愿意进!爱莫能助!!
lm_whales 2013-05-16
  • 打赏
  • 举报
回复
另外通过作用域限定符::调用的函数, 并不需要查找,虚函数表。 编译器直接,就安排了调用代码了。
lm_whales 2013-05-16
  • 打赏
  • 举报
回复
子类的虚函数会直接覆盖父类的虚函数,这种说法是不确切的。 应该这样说: 子类的虚函数,会直接替换了,虚函数表中的,父类的虚函数。 通过作用域限定符::,还是可以引用父类的虚函数。 因为虚函数的代码,或者说地址,是不会被覆盖的。 只要不是没有实现的,纯虚函数。 子类和父类的虚函数就一样, 各有各的代码空间的,地址并不相同。 不会真正被覆盖的。
quickSort 2013-05-15
  • 打赏
  • 举报
回复
动态绑定时(也就是运行期间)才会去虚函数表中找, 你这样写B::f(),调用代码在#编译期间#就确定了,和虚函数没什么关系啊
dahaiI0 2013-05-15
  • 打赏
  • 举报
回复
应该类似__super::f();
zybjtu 2013-05-15
  • 打赏
  • 举报
回复
这个其实就是基本的函数查找方式。
hugett 2013-05-15
  • 打赏
  • 举报
回复
这个根本就不会查找虚函数表。。只有通过基类指针跟引用调用虚函数才查找虚表。。 子类只是在虚表中覆盖了父类虚函数,但在子类中是可以调用虚函数的父类版本的。。
sublimepan 2013-05-15
  • 打赏
  • 举报
回复
虚函数表查找是在基类指针或引用调用时发生的,你这的B::f();已经明确函数地址了,跟查虚函数表没牵连的。
xcyl 2013-05-15
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
你回这个有什么意思呢?c++版第一水王
ztenv 版主 2013-05-15
  • 打赏
  • 举报
回复
B::f()就是函数的地址了,
nirvana_newbie 2013-05-15
  • 打赏
  • 举报
回复
你认为子类的虚函数会直接覆盖父类的虚函数 在整个子类虚函数表中已经找不到 被覆盖的父类函数了, 以上你的想法是正确的。 那么上述 B;;f()代码是如何寻址的呢? 这段代码是直接调用B类里的f()对象,而不是通过子类对象来调用。
赵4老师 2013-05-15
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
www_adintr_com 2013-05-15
  • 打赏
  • 举报
回复
它不通过虚函数表去找, 编译器直接把 B::f 的函数地址写在代码这里.

65,187

社区成员

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

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