C++析构函数未按预期工作
C++ destructor not working as intended
我正在用C++编写一个操作系统。我没有std-lib可供使用(所以我不确定这是否适用于std-lib)。看起来,如果I delete
是一个对象,它只调用变量类型(及其父对象)的析构函数。
例如:
Aa* aa = new Bb();
delete aa;
将只打印"破坏Aa"。而
Bb* bb = new Bb();
delete bb;
将同时打印"破坏Bb"answers"破坏Aa"。
我试图通过调用超类析构函数中的子类析构因子来解决这个问题(如下所示)。
这里有我遗漏的东西吗?还是我必须在初始delete
之前采用混凝土类型?
class Aa {
public:
~Aa();
};
class Bb : public Aa {
public:
~Bb() {
log("destructing Bb");
}
};
Aa::~Aa() {
log("destructing Aa");
// TODO checks if we are of type Bb
// ((Bb*) this)->~Bb(); // uncomment to test calling sub class destructor
}
您应该将Aa
的析构函数设置为虚拟的:
class Aa {
public:
virtual ~Aa();
};
这是c++的一个基本概念。你可以在这里(以及其他许多地方)阅读。
您的"Aa"析构函数不是虚拟的,所以您观察到的是预期的行为。
要获得期望的行为,请将析构函数声明为virtual ~Aa() = default;
。
相关文章:
- 在析构函数之后,围绕成员函数的C++lambda包装器是如何工作的
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 程序按执行方式工作,直到我向其添加析构函数为止
- 在删除另一个类中的一个类的对象时析构函数如何工作
- 构造函数和析构函数的工作原理
- 构造函数和析构函数之间的"unexpected"配对。为什么要这样工作?
- C++:析构函数内部如何工作以及谁调用默认析构函数
- 析构函数如何工作
- unique_ptr类型擦除析构函数不能正常工作(带有警告)
- 除以零在虚拟析构函数中工作正常
- 我无法让我的析构函数在我的代码中工作
- C++基于堆栈的构造函数/析构函数无法按预期工作
- 析构函数在c++中的工作方式
- 在虚拟析构函数的情况下,虚拟机制是如何工作的
- std::swap在构造函数、赋值运算符和析构函数方面是如何工作的
- c++中的虚析构函数是如何工作的
- 虚拟析构函数和删除具有多重继承的对象..它是如何工作的
- 析构函数之前可以工作.如何去做
- 代码可以工作,但在析构函数中崩溃(没有复制构造函数)
- C++类析构函数无法正常工作