虚拟析构函数,我在派生的 class 中没有析构函数会发生什么?

Virtual destructor, what would happen I didnt have a destructor in the derived class?

我刚上完关于虚拟析构函数的课,我有一个问题。

假设我们有以下代码:

#include <iostream>

class Base {
public:
    virtual void fun() { std::cout << "Base Fun" << std::endl; };
    virtual ~Base() { std::cout << "Base Destructor called" << std::endl; };
};

class Derived : public Base {
public:
    virtual void fun() { std::cout << "Derived Fun" << std::endl; };
    ~Derived() { std::cout << "Derived Destructor called" << std::endl; };
};

int main() 
{
    Base* b = new Base();
    Base* d = new Derived();

    b->fun();
    d->fun();

    delete b;
    delete d;

    return 0;
}

我们看到我们的 Base 类中有一个 Virtual 析构函数,这意味着当我们在 main 中删除 d 时,将调用 Base class 析构函数和 Derived class 析构函数被称为..

**但是如果我们在派生 class 中没有析构函数怎么办,我们仍然想要虚拟析构函数 + 我们仍然想删除 d。那么会发生什么?派生的 class 是否会自动“创建”一个析构函数,然后析构函数会处理资源 - d 并将其删除吗?

所有 类 都有析构函数。如果您不显式编写一个,那么编译器将隐式生成它。因此,您询问“如果我没有析构函数”的情况不存在。

and would the whole program still work as earlier?

它可以工作,但方式不完全相同,因为隐式生成的析构函数不会打印您的析构函数打印的字符串。