C++多态行为的不确定性
来源:互联网 发布:数组的indexof方法 编辑:程序博客网 时间:2024/04/30 02:42
最近做一个项目,使用了一个抽象类的线程类,使用的时候发现有时会出现调用纯虚函数的情况,代码如下:
运行时偶尔会出现如下情况:
后来把 Thread 的 Execute改了一下,改成:
调试时发现偶尔出现下面这种情况:
当我在抽象类线程函数里加Sleep(1000)后,就没有再发现这种情况了。我估计可能是动态联编有点延时。但加但我觉得也不是解决的办法。下面是我的解决办法:
在《面向对象程序设计》中有讲:
虚函数与滞后联编
多态性通过虚函数来实现,而虚函数的调用过程与滞后联编(或动态联编)密切相关,只有滞后联编才能实现多态性。也就是说,如果破坏了滞后联编,就不能调用虚函数,也就无法实现多态性。
在下列情况下,可能会破坏虚函数的滞后联编环境:
①从前面的例子可以看出,为了使用滞后联编。必须通过指针或引用来调用虚函数。如果通过非指针或非引用类型的对象来调用虚函数,则不会有滞后联编的效果。在这种情况下.编译程序无法自动判别对象是否为其派生类的类型,而直接调用指定类的成员函数。
②当在程序中以作用域运算符来调用虚函数时,将破坏滞后联编。编译程序无需判别它是否是派生类中的成员函数,因为作用域运算符已明确地要求编译程序调用指定类的成员函数。
③当在基类的构造函数和析构函数中调用虚函数时。也会破坏滞后联编。例如。假定已定义了派生类的对象,由于派生类需要先调用基类的构造函数以进行初值设定。因此程序流程首先进入基类的构造函数;但是,此时派生类部分尚未定义完整,故在基类的构造函数下无法联编派生类中的虚函数,只能进行静态联编。
通过以上例子说明:多线程(或某种特别情况)环境下:会因为派生类生成的滞后,会破坏或影响虚函数的滞后联编环境。所以在使用虚函数动态联编时,函数行为具有不确定性,使用时需谨慎。可能是我知识有限,如有不当之处还请各位大侠批评指正。
- C++多态行为的不确定性
- 需求的不确定性
- 不确定性引发的烦恼
- OS的不确定性
- 熵(测量不确定性的量度)
- 不确定性原理的前世今生
- 互联网不确定性的传奇故事
- C语言的未定义行为
- C++:vector的内部行为
- 关于C的未定义行为
- C语言的未定义行为
- 一个用C来模拟类的多态行为的例子
- linux中断的不确定性带来的问题
- IOCP GetQueuedCompletionStatus多线程切换的不确定性
- 不确定性原理的前世今生:傅里叶变换
- 李天田:不确定性时代的管理变革
- 不确定性是量子计算的特点
- SAFT是监管不确定性的症状之一
- Mysql索引
- XSLT拷贝所有节点
- rootfs的挂载过程
- 应该脱口而出的100个精典英文句子
- AJAX TabContainer 样式设置
- C++多态行为的不确定性
- windows 进程
- bat文件启动外壳
- 水晶报表自动换页
- 很好的一个个人博客主业
- 工作体验
- 硬盘分区概念
- 堆与栈 与回调函数 与windows消息
- 我的型体训练