虚函数机制理解
来源:互联网 发布:宫刑 知乎 废除 编辑:程序博客网 时间:2024/06/06 09:04
再次翻阅深度探索C++对象模型,算是对虚函数机制又多了一层理解了。以例子说明
- class ZooAnimal
- {
- public:
- ZooAnimal();
- virtual ~ZooAnimal();
- virtual void animate();
- virtual void draw();
- // ....
- private:
- // ZooAnimal的animate()和draw()所需要的数据
- };
- class Bear: public ZooAnimal
- {
- public:
- Bear();
- void animate(); // 虽然没有显式表明是virtual,但是从基类继承virtual属性
- void draw(); // 虽然没有显式表明是virtual,但是从基类继承virtual属性
- virtual void dance();
- // ....
- private:
- // Bear的animate()和draw()以及dance()需要的数据
- };
上面定义了ZooAnimal类和Bear类,我们来解释下在以下两种情况中编译器会做哪些操作:
例1:
Bear yogi;
ZooAnimal franny = yogi ;
例2:Bear yogi;
ZooAnimal *franny = &yogi;
在上面两个例子中,我们要是同时调用franny.draw() 会发生什么情况呢?
在例1中,实际上是调用的ZooAnimal 类版本的draw函数,而在例2中,将调用Bear类版本的ZooAnimal函数。
原因是:
例1中相当于执行的合成的复制构造函数的操作,在复制构造函数中,会显示设定对象franny的vptr指向ZooAnimal class 的virtual table。
例2中相当于进行了指针的强制类型转换,而指针的强制类型转换的本质就是截取地址的多大部分,具体原理请参见:http://blog.sina.com.cn/s/blog_4e967c8b0100zh6h.html
以上可知要触发动态绑定,必须满足两个条件:第一:只有指定为虚函数的成员函数才能进行动态绑定。第二,必须通过基类类型的引用或者指针进行函数调用。举例:
double print_total(const Item_base&, size_t);
Item_base item;
print_total(item, 10); // OK
Bulk_item bulk;
print_total(bulk, 10); // OK 引用bulk中Item_base的部分。
Item_base *item = &bulk; // OK , 指针指向bulk 的Item_base部分。
- 虚函数机制理解
- 深入理解C++虚函数机制
- 深度探索C++对象模型之:理解虚函数机制
- 从汇编角度理解C++虚函数调用机制
- Objective-C函数消息机制的理解
- 深入理解python函数传参机制
- 理解python函数传参机制
- 深入理解python函数传参机制
- 从Swift深入理解函数派发机制
- 深入理解C++虚函数底层机制和RTTI运行时类型识别
- 有图有真相带你理解C++中虚函数调用机制
- 虚函数实现机制
- C++虚函数机制
- 虚函数实现机制
- 虚函数实现机制
- 虚函数实现机制
- C++虚函数机制
- 虚函数机制
- JSP中页面跳转的两种方式
- forword和sendRedirect传值的区别
- 用VC实现对超长数据库字段的操作
- 在Android下利用Shell命令管理网络接口
- CXF入门教程(2) -- 第一个客户端
- 虚函数机制理解
- C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?(转帖)
- poj2262
- 移动应用丰富动效的六点原则
- C++继承:共有,私有,保护
- Android Activity中启动另一应用程序的方法,无需得到类名
- I2C总线驱动在嵌入式系统中的两种实现
- 类图(转载)
- SQL Server 2008中增强的汇总技巧