一个比较奇怪的类继承关系 和函数调用过程。

wenluderen 2015-04-20 09:14:38
A是爷爷类。
B是儿子类。
C是孙子类。

×××××××××××××××××××××
A里面定义一个虚函数 XX()

B里面没有定义XX() 但是调用XX()

C里面定义了 XX()。

×××××××××××××××××××××××××××
B调用XX()的过程是不是这样样子?
第一步:在自己类里面没有找到XX()的定义,就到父亲里面找。

第二步:到了父亲A类里面发现这样一个虚函数。就到子类里面也就是B类里面找到 发现没有。

第三步:既然B类里没有就继续到孙子类里面也是C里面找,最后终于找到了XX()的定义。


×××××××××××××××××××××××××××××××××××

这是在一个真是项目项目里面的程序,我调试的时候如果在B类里面按住F12就会跳转到A的虚函数里面。
但是真是运行的时候就会跳转到C类的XX()里面。

×××××××××××××××××××××××××××××××
谢谢。

请各位发表见解。
...全文
141 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenluderen 2015-04-26
  • 打赏
  • 举报
回复
各位老大, 一个类只能调用自身的成员函数或是父类继承过来的函数,除非这个这个类的实例化对象赋值的是他子类的指针。 发个这个帖子的是因为两个问题没有解决。 一:赋值的时候要指针 二:那个程序中使用了 模板类的概念 这个概念问我不熟。 最好谢谢大家的参与。
笨笨仔 2015-04-21
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
不会,你声明的变量是什么对象,虚函数就和定义变量的类一致,如果没有对应的函数,就找前辈,直到找到 除非,你明确的 A::vFun的方式调用 调用儿孙的函数一般都是错误的
赞同,看来楼主对“虚函数”并不了解,还是先重温一下C++教程。
worldy 2015-04-20
  • 打赏
  • 举报
回复
引用 楼主 wenluderen 的回复:
A是爷爷类。 B是儿子类。 C是孙子类。 ××××××××××××××××××××× A里面定义一个虚函数 XX() B里面没有定义XX() 但是调用XX() C里面定义了 XX()。 ××××××××××××××××××××××××××× B调用XX()的过程是不是这样样子? 第一步:在自己类里面没有找到XX()的定义,就到父亲里面找。 第二步:到了父亲A类里面发现这样一个虚函数。就到子类里面也就是B类里面找到 发现没有。 第三步:既然B类里没有就继续到孙子类里面也是C里面找,最后终于找到了XX()的定义。 ××××××××××××××××××××××××××××××××××× 这是在一个真是项目项目里面的程序,我调试的时候如果在B类里面按住F12就会跳转到A的虚函数里面。 但是真是运行的时候就会跳转到C类的XX()里面。 ××××××××××××××××××××××××××××××× 谢谢。 请各位发表见解。
F12地址不一定准确,以实际运行才是准确的位置
lx624909677 2015-04-20
  • 打赏
  • 举报
回复
你应该debug模式下,然后添加断点,到达那个函数后,按F11,才是实际运行过程中真正走的函数
worldy 2015-04-20
  • 打赏
  • 举报
回复
所有虚函数会建立一个虚函数地址表 编译的时候,会在类中找是否有该虚函数定义,如果没有,则找父类,再找爷类....然后将该地址填入到虚函数地址表 创建类(new或在栈中定义变量)的时候,地址表就已经确定, 调用的时候,就在该地址表里找函数地址(计算偏移量即可),找到就调用
lx624909677 2015-04-20
  • 打赏
  • 举报
回复
你是什么编译器?VC的话F12是跳转到定义,想看运行过程中走的那个函数是设断点,然后到达函数调用的地方后按F11
worldy 2015-04-20
  • 打赏
  • 举报
回复
不会,你声明的变量是什么对象,虚函数就和定义变量的类一致,如果没有对应的函数,就找前辈,直到找到 除非,你明确的 A::vFun的方式调用 调用儿孙的函数一般都是错误的
wenluderen 2015-04-20
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
所有虚函数会建立一个虚函数地址表 编译的时候,会在类中找是否有该虚函数定义,如果没有,则找父类,再找爷类....然后将该地址填入到虚函数地址表 创建类(new或在栈中定义变量)的时候,地址表就已经确定, 调用的时候,就在该地址表里找函数地址(计算偏移量即可),找到就调用
会不会像向下找呢? 比如到他的儿子类 孙子类 里面找个函数定义。。
wenluderen 2015-04-20
  • 打赏
  • 举报
回复
引用 1 楼 lx624909677 的回复:
你是什么编译器?VC的话F12是跳转到定义,想看运行过程中走的那个函数是设断点,然后到达函数调用的地方后按F11
我调试的时候会从B类中的 XX() 跳转到C类中XX()定义位置。 但是在在VS2012里面,按住F12会跳转到A类的 虚函数 XX()。位置。 我只是想知道 一个类的成员函数如果是虚函数XX(),如果某个函数调用这个虚函数XX(),他是否会向他的子类 或者孙子 类 寻找这个函数的定义。。。。? 谢谢

16,482

社区成员

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

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

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