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

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么。
迷惑
...全文
833 5 打赏 收藏 转发到动态 举报
写回复
用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? 搜不到。。。翻译成中文是啥? 楼上说虚表都不用看,虚函数还可以不通过虚表直接访问么?

64,647

社区成员

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

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