c++ - 基类函数被调用两次

标签 c++ class oop

我有一个基类和一个派生类。我想让用户决定何时 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/

相关文章:

java - 覆盖所有 parent 都在该方法中工作的方法?

c++ - Lua:多次调用返回字符串的 Lua 函数。如何做到这一点,以便有交叉到下一个实例的字段

c++ - 使用 NativeMessaging 的 Chrome 扩展无法接收某种 json 数据

c++ - 为什么 std::reverse 需要双向迭代器?

Python初学者类变量错误

c++ - 将类作为参数传递,该类具有不带参数的私有(private)构造函数

c# - 选择基于返回类型的调用结构

c++ - gcc 4.7.2 中虚函数对非虚函数的奇怪阴影

php - 为什么公共(public)函数可以通过静态调用来访问 - PHP?

java - java类重载配置依赖的设计