我有一个基类和一个派生类。我想让用户决定何时 free()
两个类分配的内存,这些函数也将被类的析构函数调用。
但是,这种做法强制调用基类free()
函数两次,第一次从派生类free()
函数调用,第二次来自基本析构函数。
class Base
{
public:
Base() {
_baseVal = new int(4);
cout << "base constructor\n";
}
virtual void free()
{
if(_baseVal) {
delete _baseVal;
_baseVal = 0;
}
cout << "base free()\n";
}
virtual ~Base() {
free();
}
private:
int *_baseVal;
};
class Derived : public Base
{
public:
Derived() {
_derivedVal = new int(10);
cout << "derived constructor\n";
}
void free()
{
Base::free();
if(_derivedVal) {
delete _derivedVal;
_derivedVal = 0;
}
cout << "derived free()\n";
}
~Derived() {
free();
}
private:
int *_derivedVal;
};
int main()
{
Base *der = new Derived;
delete der;
system("pause");
return 0;
}
输出:
base constructor
derived constructor
base free()
derived free()
base free()
对于这种方法,有什么方法可以不强制调用两次基本 free()
吗?
最佳答案
析构函数没有被调用两次,但是 Base::free()
被调用了两次。区别很重要,因为后者是您自己的类方法。析构函数由编译器调用,并且只调用一次。
当 Derived
对象超出范围时,首先调用它自己的析构函数。在 Derived::~Derived
中调用 Derived::free()
。您在那里做的第一件事是调用 Base::free()
。然后处理派生类逻辑的其余部分。当 Derived
部分被清理后,Base
部分的析构函数被执行,它本身调用 Base::free()
。
原则上你在这里没有问题,因为你确保 Base::free()
如果它已经运行(通过设置 _baseVal
到一个空指针)。您可以通过从 Derived::free()
中删除对 Base::free()
的调用来避免它,但是,因为 Base
析构函数将保证 Base::free()
至少运行一次。
关于c++ - 基类函数被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658495/