C++多态行为的不确定性

来源:互联网 发布:数组的indexof方法 编辑:程序博客网 时间:2024/04/30 02:42

最近做一个项目,使用了一个抽象类的线程类,使用的时候发现有时会出现调用纯虚函数的情况,代码如下:

运行时偶尔会出现如下情况:

 

后来把 Thread 的 Execute改了一下,改成:

 

调试时发现偶尔出现下面这种情况:

 

 

 

当我在抽象类线程函数里加Sleep(1000)后,就没有再发现这种情况了。我估计可能是动态联编有点延时。但加但我觉得也不是解决的办法。下面是我的解决办法:

 

 

 

在《面向对象程序设计》中有讲:

虚函数与滞后联编
  多态性通过虚函数来实现,而虚函数的调用过程与滞后联编(或动态联编)密切相关,只有滞后联编才能实现多态性。也就是说,如果破坏了滞后联编,就不能调用虚函数,也就无法实现多态性。
  在下列情况下,可能会破坏虚函数的滞后联编环境:
  ①从前面的例子可以看出,为了使用滞后联编。必须通过指针或引用来调用虚函数。如果通过非指针或非引用类型的对象来调用虚函数,则不会有滞后联编的效果。在这种情况下.编译程序无法自动判别对象是否为其派生类的类型,而直接调用指定类的成员函数。
  ②当在程序中以作用域运算符来调用虚函数时,将破坏滞后联编。编译程序无需判别它是否是派生类中的成员函数,因为作用域运算符已明确地要求编译程序调用指定类的成员函数。
  ③当在基类的构造函数和析构函数中调用虚函数时。也会破坏滞后联编。例如。假定已定义了派生类的对象,由于派生类需要先调用基类的构造函数以进行初值设定。因此程序流程首先进入基类的构造函数;但是,此时派生类部分尚未定义完整,故在基类的构造函数下无法联编派生类中的虚函数,只能进行静态联编。

 

通过以上例子说明:多线程(或某种特别情况)环境下:会因为派生类生成的滞后,会破坏或影响虚函数的滞后联编环境。所以在使用虚函数动态联编时,函数行为具有不确定性,使用时需谨慎。可能是我知识有限,如有不当之处还请各位大侠批评指正。