C++ C++;虚拟方法不工作
给出以下示例:C++ C++;虚拟方法不工作,c++,function,inheritance,methods,virtual,C++,Function,Inheritance,Methods,Virtual,给出以下示例: class BaseClass { BaseClass() { }; virtual ~BaseClass() { this->Cleanup(); }; virtual void Cleanup() { // Do cleanup here. }; }; class Level1DerivedClass : public BaseClass { Level1DerivedClass() { };
class BaseClass
{
BaseClass()
{
};
virtual ~BaseClass()
{
this->Cleanup();
};
virtual void Cleanup()
{
// Do cleanup here.
};
};
class Level1DerivedClass : public BaseClass
{
Level1DerivedClass()
{
};
virtual ~Level1DerivedClass()
{
};
virtual void Cleanup()
{
// Call my base cleanup.
BaseClass::Cleanup();
// Do additional cleanup here.
};
};
class Level2DerivedClass : public Level1DerivedClass
{
Level2DerivedClass()
{
};
~Level2DerivedClass()
{
};
void Cleanup()
{
// Call my base cleanup.
Level1DerivedClass::Cleanup();
// Do additional cleanup here.
};
};
main()
{
Level2DerivedClass * derived2 = new Level2DerivedClass();
delete derived2;
return 0;
}
当我删除我的派生类引用时,我希望流程如下所示:
正确的做法是:在析构函数中清理你自己,并且只清理你自己。不要跟着你的孩子或父母打扫 如果你不想从析构函数中清理东西,那你就错了。在C++中,我们有一个叫做RAII的小东西,资源获取是初始化。但也有它的双重属性,它似乎没有一个正式的名字,但这里有一个可能起作用的东西:RDID,资源处置就是破坏
当然,你不必坚持RAII/RDID哲学,但那不是C++方式。< /P>编译吗?错误:“BaseClass::BaseClass()”是privateAlessandro,抱歉。这不是真正的代码,只是一个示例,代表了我在程序中要做的事情。谢谢,奥利!这就是我所缺少的。谢谢你的解释。因此,一个可能的解决方案是在每个类中放置一个非虚拟Cleanup()方法,并从每个类自己的析构函数调用它。虚拟析构函数仍将确保调用所有析构函数-Cleanup()不会像我现在这样由虚拟实现处理。听起来不错?谢谢NM。我一直在学习C++的新东西,这不是我以前遇到过的。关于最佳实践的好提示。