我对虚拟析构函数感到困惑。我已经阅读了很多问题和解释,但我仍然不明白,如果有来自基类的派生类,我是否需要实现自己的析构函数,即使它没有任何特殊操作。
编译器编译下面的代码,但是会出现任何内存泄漏或任何问题吗?
Class Base{
public:
virtual ~Base(){}
};
Class Derived : public Base{
// do i need a special destructor here for Derived ?
}
Base *foo;
foo = new Derived;
delete foo;
答案 0 :(得分:2)
如果您没有为Derived
提供析构函数,则会自动创建一个析构函数。自动创建的析构函数会覆盖Base
中的析构函数,因此在删除foo
时会调用它。自动创建的析构函数将等同于:
Class Derived : public Base {
~Derived() { } // this is what you get if you don't provide your own.
}
所有析构函数,无论是否自动创建,都将自动调用类的所有成员的析构函数和基类的析构函数。所以一切都得到了很好的清理。
答案 1 :(得分:1)
不存在内存泄漏,因为Derived
将获得它的隐式虚析构函数。