博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类虚函数
阅读量:6327 次
发布时间:2019-06-22

本文共 1515 字,大约阅读时间需要 5 分钟。

 

  理解C++中继承层次的关键在于理解如何确定函数调用,确定函数调用遵循以下四个步骤:

(1)首先确定进行函数调用的对象,引用或指针的静态类型。

(2)在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关基类中找到该名字,则调用是错误的。

(3)一旦找到了该名字,就进行常规类型检查,查看如果给定找到的定义,该函数调用是否合法。

(4)假定函数调用合法,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数。

1 class Base{ 2 public: 3     virtual int fcn();   4 } 5  6  7 class D1: public Base{ 8 public:  9     //hides fcn in the base; this fcn is not virtual 10     int fcn(int);   //nonvirtual function hides D1::fcn(int)11     //D1 inherits definition of Base::fcn()12 }13 14 class D2 : public D1{ 15 public: 16     int fcn(int);   //nonvirtual function hides D1::fcn(int)17     int fcn();      //redefines virtual fcn from Base18 }19 20 D1中的fcn版本没有重定义Base的虚函数fcn,相反,它屏蔽了基类的fcn。21 结果D1有两个名为fcn的函数:1、类从Base继承了一个名为fcn的虚函数,22 2、类又定义了自己的名为fcn的非虚成员函数,该函数接受了一个int的23 形参。但是,从Base继承的虚函数不能通过D1对象(或D1的引用或指针)24 调用,因为该函数被fcn(int)的定义屏蔽了。25 26 类D2重定义了它继承了两个函数,它重定义了Base中定义的fcn的原始版本27 并重定义了D1中定义的非虚版本;28 //通过基类调用被屏蔽的虚函数29 //通过基类类型的引用或指针调用函数时,编译器将在基类中查找该函数而忽略派生类:30     Base bobj;  D1 d1obj; D2 d2obj;31     Base *bp1 = &bobj, *bp2 = &d1obj, *bp3 = &d2obj;32     bp1->fcn();     //ok:virtual call, call Base::fcn at run time33     bp2->fcn();     //ok:virtual call, call Base::fcn at run time34     bp3->fcn();     //ok:virtual call, call D2::fcn at run time35 36 三个指针都是基类类型的指针,因此通过在Base中查找fcn来确定这三个调用,37 所以这些调用是合法的;另外,因为fcn是虚函数,所以编译器会生成代码,38 在运行时基于引用或指针所绑定的对象的实际类型进行调用。在bp2的情况,39 基本对象是D1类的,D1类没有重定义不接受实参的虚函数版本,通过bp2的函数40 调用(在运行时)调用Base中的定义的版本;

 

转载地址:http://ucgaa.baihongyu.com/

你可能感兴趣的文章
校门外的树2
查看>>
杭电2085--核反应堆(打表)
查看>>
杭电3785--寻找大富翁
查看>>
ASP.NET请求过程-从源码角度研究MVC路由、Handler、控制器
查看>>
BASE64编码解码
查看>>
Flask总结
查看>>
获得表字段名称和数据类型
查看>>
关键帧动画实现圆弧动画
查看>>
openwrt 按下回车才能显示图标信息
查看>>
codeforces 600A Extract Numbers
查看>>
LinearLayout控件
查看>>
tomcat 配置项目
查看>>
事件类型
查看>>
7、RabbitMQ-主题模式
查看>>
MVC & MVP 模式
查看>>
HDU 5340 Three Palindromes(Manacher)
查看>>
转载利用线性渐变实现晴天、多云特效
查看>>
软件架构自学笔记——质量属性之淘宝网的常见属性场景
查看>>
[转载] 七龙珠第一部——第123话 如意棒的秘密
查看>>
ts 与 C#的 一个差异的地方
查看>>