{使用Visual Studio 2010和Win7}
class Base
{
public:
Base() : terminateCondition(false)
{
//spawn new thread and set entry point to newThreadFunc()
}
virtual ~Base() // edited to say it's virtual.
{
terminateCondition=true;
//wait for thread to join
}
virtual void vfunc() = 0;
static void __stdcall newThreadFunc(void *args)
{
while(!terminateCondition)
pThis->vfunc();
}
volatile bool terminateCondition;
};
class Derived : public Base
{
public:
virtual void vfunc()
{
//Do Something
}
};
Derived* dPtr=new Derived; //now assume pThis is dptr
//later somewhere
delete dPtr;
Run Code Online (Sandbox Code Playgroud)
此代码崩溃说pure virtual called。移动terminateCondition=true到的析构函数Derived防止此崩溃。我想我部分地明白了为什么。破坏是按照相反的顺序进行的,因此在调用d'tor之前Derived首先执行的d'tor,并Derived破坏的所有功能Base。同时,如果pThis->vfunc()遇到该应用程序将崩溃。崩溃说纯虚拟被称为。我听不懂这部分。有人可以解释一下吗?
您的基类析构函数必须是virtual,因为不是,此代码将调用未定义行为。
参考:
C ++ 03标准:第5.3.5 / 3节:
如果操作数的静态类型不同于其动态类型,则静态类型应为操作数动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义。
当您通过构造函数/析构函数调用虚拟函数时,动态分派将无法按预期方式工作。
该类型this的构造函数/析构函数是谁的正在执行的构造函数/析构函数的类的类型。当您期望动态调度调用覆盖的派生类方法时Derived::vfunc(),它最终会Base::vfunc()导致没有定义的调用,从而导致未定义行为。
参考:
C ++ 03标准10.4 / 6:
“成员函数可以从抽象类的构造函数(或析构函数)中调用;对于从此类构造函数中创建(或销毁)的对象直接或间接对纯虚函数进行虚拟调用(10.3)的效果(或析构函数)未定义。”
| 归档时间: |
|
| 查看次数: |
242 次 |
| 最近记录: |