我试着理解在退出范围时析构函数调用的顺序。假设我有以下代码:
class Parent{
Parent(){cout<<"parent c called \n";}
~Parent(){cout<< "parent d called \n";}
};
class Child: public parent{
Child(){cout<< "child c called \n";}
~Child(){cout<<"child d called\n";}
};
现在,我知道子构造函数
我理解为什么会发生这种情况,但是当我的程序退出时,我的代码在生成错误(从而导致崩溃)时,我的代码一直在努力解决it...here。
pure virtual method called
SomeClass::~SomeClass()
{
BaseClassObject->SomePureVirtualMethod(this);
}
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
//Do stuff to remove obj from a collection
}
我从来没有调用过new SomeCl
但是在后台发生了什么呢?
我的意思是一个子类继承了它的基类的这个虚拟析构函数。继承某些东西对我来说意味着获得它的原样。但在这种情况下,子类不会获得基类所具有的析构函数。(也许它会变得一样,特别是如果它没有身体的话)。关键是,即使子类没有重新定义它,它也会做其他事情。那么这是如何工作的呢?
假设我们有(C++):
class BaseClass{
int i;
public:
virtual ~BaseClass(){}
};
class SubClass: public BaseClass{
int j;
};
BaseClass* bptr = new SubClass;
根据准则:
如果需要默认析构函数,但其生成已被抑制(例如,通过定义移动构造函数),则使用=default。
我无法想象在类中,如果没有显式默认析构函数,代码什么时候会出现错误,而类中有移动构造函数。
有人能给我举个例子证实上面的话吗?
struct S {
S() {};
S( S&& ) {}; // move ctor
};
int main() {
S s; // there is no need to declare dtor explicitly =default
}
{使用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 f