基类函数被调用两次
Base class function gets called twice
我有一个基类和一个派生类。我想让用户决定何时free()
两个类分配的内存,这些函数也将由类的析构函数调用。
然而,这种方法强制调用基类free()
函数两次,第一次来自派生类free()
函数,第二次来自基类析构函数。
class Base
{
public:
Base() {
_baseVal = new int(4);
cout << "base constructorn";
}
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 constructorn";
}
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()
至少运行一次。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- 如何使用单个对象调用具有相同名称的两个类函数
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 构造函数在不同线程中的静态单例类上调用两次
- 类析构函数在创建shared_ptr时调用两次
- [c++]为什么我的类析构函数被调用两次?
- 在子类的构造函数中调用超类的构造器两次
- 基类函数被调用两次
- 两次声明纯虚拟函数(在层次结构中的两个类中)是否完全合法
- 为什么基类的构造函数方法被调用两次?
- 防止虚拟函数白令在子类中重载两次
- 调用对数组引用两次的函数
- 当我调用绑定的 c++ 类函数两次时出现 lua 错误?
- std::make_shared在VS2012中进行了两次构造函数调用
- 类成员运算符new,调用构造函数两次
- C++两次传递函数指针导致问题
- 类构造函数声明了两次
- 奇怪的行为合并两个类函数并通过引用传递变量