#include <iostream>
using namespace std;
class Base
{
public:
~Base() // 注意,这不是 virtual
{
cout << "~base\n";
}
virtual void func() = 0;
};
class BasePlus: public Base
{
public:
~BasePlus()
{
cout << "~baseplus\n";
}
void func() override
{
cout << "baseplus func\n";
}
};
int main()
{
Base*p = new BasePlus;
p->func();
delete p;
return 0;
}
output:
baseplus func
我的理解是也应该输出 ~base
,但实际并没有,有点想不明白为什么?
这实际是一个 undefined behavior。
expr.delete#3
含有 UB 的程序什么都可能发生
godbolt 上,是可以打印出
~base
的。destroying operator delete
就是长这样的: