对多态性和虚拟析构函数的误解

AJ *_*Tan 1 c++ polymorphism inheritance delete-operator virtual-destructor

例子:

class Base {
  public:
    virtual void f() = 0;
    virtual ~Base() { std::cout << "Base::~Base()\n"; }
};

class Derived : public Base {
  public:
    void f() { }
    ~Derived() { std::cout << "Derived::~Derived()\n"; }
};

int main() {
  Base* p = new Derived();
  delete p;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Derived::~Derived()
Base::~Base()
Run Code Online (Sandbox Code Playgroud)

我认为只会调用派生类析构函数,因为要释放的指向对象是派生类的实例。

我有两个问题:

  1. 为什么调用虚拟基析构函数?
  2. 阻止基类析构函数被调用在法律​​上是否可能(或者甚至应该可能)?

Ser*_*eyA 5

为什么调用虚拟基析构函数?

因为基类应该被正确地破坏。派生类不可能做到这一点。

阻止基类析构函数被调用在法律​​上是否可能(或者甚至应该可能)?

不,因为它会阻止正确破坏基类(即调用它的成员析构函数)