子类对象强行调用父类虚函数。

tangcat123 2014-03-23 10:46:09
class A

{

protected:

int m_data;

public:

A(int data = 0){ m_data = data; }

int GetData(){ return doGetData();}

virtual int doGetData(){ return m_data;/*m_data =0 */}

};



class B:public A

{

protected:

int m_data;

public:

B(int data = 1){ m_data = data; }

//这里A 中的m_data = 0 ,B中的m_data = 1



int doGetData(){ return m_data ;/*m_data =1 */} //实现接口

};



class C:public B

//C继承了A&B类的方法&属性,且未从新定义接口,故接口还是B类中定义的

{

protected:

int m_data;

public:

C(int data = 2){ m_data = data; }

//这里A 中的m_data = 0 ,B中的m_data = 1,C 类中的m_data = 2

};



int main()

{

C c( 10);

cout<< c.GetData()<< endl; //输出为:1

cout<< c.A::GetData()<< endl;//输出为:1

cout<< c.B::GetData()<< endl; //输出为:1

cout<< c.C::GetData()<< endl; //输出为:1



cout<< c.doGetData()<< endl; //输出为:1

cout<< c.A::doGetData()<< endl; //输出为:0

cout<< c.B::doGetData()<< endl; //输出为:1

cout<< c.C::doGetData()<< endl; //输出为:1



system("pause");

return 0;

}


这里我有点迷惑
c.A::doGetData()
c对象的内存布局中他的虚函数表里是没有A的doGetData这个虚函数的啊
如果强行去找对应A的doGetData,他是怎么找到的?
还有就是 c.A::GetData()和c.A::doGetData()最终不都相当于A类指针指向C类对象么,答案不应该都是1么。
迷惑
...全文
856 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
弦音后弹 2014-03-23
  • 打赏
  • 举报
回复
从楼主问的上看应该是c.doGetData()的过程吧,因为C中没有重载对应的虚函数,故而直接是调用的父类的对应的虚函数,因为在生成C对象的时候会生成对应的B对象和A对象的。
飞天御剑流 2014-03-23
  • 打赏
  • 举报
回复
A::doGetData叫qualified-id,名称查找方法与unqualified-id是不同的,qualified-id直接从reaching scope中查找名称,它抑制了虚函数所使用的最终覆盖者判定。
FancyMouse 2014-03-23
  • 打赏
  • 举报
回复
>如果强行去找对应A的doGetData,他是怎么找到的? 根本就没去找。你既然explicitly说了A::doGetData那就直接调用了,虚表看都不看。
zhuyf87 2014-03-23
  • 打赏
  • 举报
回复
引用 4 楼 tangcat123 的回复:
[quote=引用 2 楼 supermegaboy 的回复:] A::doGetData叫qualified-id,名称查找方法与unqualified-id是不同的,qualified-id直接从reaching scope中查找名称,它抑制了虚函数所使用的最终覆盖者判定。
qualified-id?reaching scope? 搜不到。。。翻译成中文是啥? 楼上说虚表都不用看,虚函数还可以不通过虚表直接访问么?[/quote] 这时候已经没有虚表,虚函数什么事了吧。2楼已经说了“qualified-id直接从reaching scope中查找名称,它抑制了虚函数所使用的最终覆盖者判定。”
tangcat123 2014-03-23
  • 打赏
  • 举报
回复
引用 2 楼 supermegaboy 的回复:
A::doGetData叫qualified-id,名称查找方法与unqualified-id是不同的,qualified-id直接从reaching scope中查找名称,它抑制了虚函数所使用的最终覆盖者判定。
qualified-id?reaching scope? 搜不到。。。翻译成中文是啥? 楼上说虚表都不用看,虚函数还可以不通过虚表直接访问么?
# 简介 纪念一下人生第一个C++程序,浙江大学2020春学期《C++与数据结构》期末作业:用异质链表实现一个职工管理系统,并可以将链表以二进制文件的形式储存在本地 # 人事管理系统 用所学过的知识编写一个简单的人事管理系统,要求功能如下 用链表存储、文件输入、输出。 具有建立、插入、删除、查询和打印功能。 平台不限、链表可用公共模板类(最好自己写)。 管理的人员有: 本科生:姓名、性别、年龄、身份证号码、高考总分 脱产研究生:姓名、性别、年龄、身份证号码、专业 在职研究生:姓名、性别、年龄、身份证号码、学号、专业、工资 职工:姓名、性别、年龄、身份证号码、工资、岗位 教师:姓名、性别、年龄、身份证号码、工资、专业 ## 一、作业概况简述 参考了老师提供了两篇文档:异质链表1.doc和异质链表2.doc 异质链表1.doc的思路是,先定义好Person基类和各种派生类,然后定义一个抽象的节点和链表类,这样做的好处是存储的内容(人的信息)和存储方式(链表)相互独立,便于后期维护。 异质链表2.doc则将每个Person都定义为一个节点,这样如果链表出错了或者需要变更功能,可能会影响到Person类的实现;或者如果我不想用链表了,想换个储存方式,那写在Person里的有关节点的东西就没有用处了,降低了代码的存储效率和可读性,这种情况下代码就略显冗余。 写到后面发现如果要追求链表类和Person及其派生类完全独立,就涉及到类访问权限、模板类友元、声明的问题,写起来很繁琐,所以也没有做到二者完全独立。 另外文件读写方面用到是二进制的读写,牵扯出一系列麻烦事儿,在3.6节有详细叙述。 ## 二、系统概述 本系统分为四个部分: 1.Interface.h与Interface.cpp 主界面的声明与实现 2.Person.h 定义并实现了Person基类,Undergraduate本科生类,FullTimePostgraduate脱产研究生类,OnJobPostgraduate在职研究生类,Worker职工类,Teacher教师类。 3.HeterList.h 定义并实现了基于模板的Node类和HeterList类,拥有建立(构造函数)、插入(Insert)、删除(Delete)、查询(Search)和打印(Display)功能。 4.Main.cpp 和用户交互的主程序,为了便于测试,系统设计了一个test02()函数,并默认在main()中调用,作用是给系统初始化5个人物: ## 三、功能概述 ### 3.1 建立新表并查看默认的5个人物: ### 3.2 插入一个人物: ### 3.3 删除一个人物: 由于只有身份证不会重复,因此只提供搜寻身份证删除功能。如果需要删除叫“张三”的人,需要先搜索所有叫“张三”的人,然后决定删除哪一个,输入他的身份证号即可。 ### 3.4 查找一个人物: 提供了按姓名、性别、年龄批量查找,和按身份证号精确查找 ### 3.5 清空链表: ### 3.6 保存和读取: 这里采用二进制文件读写,直接保存Person的几个类。 这里有个大坑: 由于二进制读写是直接读写对象,因此: 1. 保存的时候不能直接用异质链表里的节点储存的对象,因为异质链表里的是Person类型而不是类,最终保存的对象是不含有类独有的成员函数的; 2. 读取的时候就要确定是哪一个类,否则无法读取。同时读取的是含有虚函数类,此时虚表指针无法指向虚函数表,强行调用读取后的类的函数会引起访问权限冲突。 基于以上两点: 1. 在储存的时候,按照不同的类分文件储存,如下: 2. 在储存的时候,栈区创建一个类X,将链表上的Person类的值赋给类X(C++默认的构造函数是不支持父类直接拷贝给类的,因此我在每一个类里都写了一个父类赋值给类的构造函数),向文件中写入X。 3. 在读取的时候,为了解决虚函数表的问题,我又用拷贝构造重新new了一个新的类,新的类的虚函数表是没有问题 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

65,187

社区成员

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

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