C++ 虚拟析构函数,如果派生类中没有析构函数,会发生什么?

C++ 虚拟析构函数,如果派生类中没有析构函数,会发生什么?,c++,destructor,virtual-destructor,C++,Destructor,Virtual Destructor,我刚刚上了关于虚拟析构函数的课,我有一个问题 假设我们有以下代码: #include <iostream> class Base { public: virtual void fun() { std::cout << "Base Fun" << std::endl; }; virtual ~Base() { std::cout << "Base Destructor called" <

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

假设我们有以下代码:

#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;
}
#包括
阶级基础{
公众:

virtual void fun(){std::cout所有类都有一个析构函数。如果不显式编写一个,编译器将隐式生成它。因此,您询问的“如果我没有析构函数”的情况不存在

整个计划还会像以前一样有效吗


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

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

整个计划还会像以前一样有效吗


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

首先,您可以自己尝试一下,看看会发生什么。虽然这不是结论,但可能会给出一些提示。我还建议您阅读,例如,查看何时、何地以及在什么情况下编译器将为您创建析构函数,以及如何对其进行限定。首先,您可以自己尝试,看看会发生什么。虽然这不是结论,但可能会给出一些提示。我还建议您阅读,例如,看看编译器何时、何地、在什么情况下为您创建析构函数,以及我如何a好吧,我想这就回答了我的问题。我也得出了同样的结论。我真的,我只是想确认一下。再次谢谢你!我真的不在乎关于这个字符串,我只是想知道它是否真的会删除ressource——这是d。我只是在删除它之后再次尝试访问d->fun()来测试它,而d确实被删除了。所以有一种“自动创建/不可见”的感觉派生类中的析构函数,而我自己并没有实现它。真的所有类?像这样的病态情况()放在一边,是的;)@maximum_prime_是_463035818好的,那个“有一个已删除的析构函数”:)啊,好吧,我想这回答了我当时的问题。我也得出了同样的结论,我只是想得到一种确认。再次感谢!我并不真的“关心”字符串,我只是想知道它是否真的会删除ressource-这是d。我只是通过尝试访问d->fun()来测试它在我删除它之后,它会再次被删除,而d确实被删除了。因此,当我自己没有实现它时,派生类中会出现某种“自动创建/不可见”的析构函数。真的所有类?像这样的病态情况()除外,是的;@maximum_prime_是_463035818好的,那一个“有一个已删除的析构函数”: