【问题标题】:Why is destructor always declared virtual [duplicate]为什么析构函数总是声明为虚拟的[重复]
【发布时间】:2012-03-09 11:38:14
【问题描述】:

可能重复:
When to use virtual destructors?
Virtual destructor and undefined behavior

我是 C++ 和编程的新手,我观察到析构函数总是被声明为虚拟的。 我可以知道为什么会这样吗?

提前致谢

【问题讨论】:

  • 欢迎来到 Stack Overflow。请在发布新问题之前使用搜索;许多人已经被问到并得到了回答。

标签: c++ destructor


【解决方案1】:

它被声明为 virtual 以便继承类会记住重写此方法以进行自己的清理。这对于防止内存泄漏很重要。

【讨论】:

  • 错了。析构函数不能重载。
  • 这是一种允许在继承链上的指针调用自己的析构方法的意思,即。 BaseClass* ptr = new DerivedClass();删除指针;所以它会让“ptr”正确调用自己正确的析构方法。
【解决方案2】:

总是声明为virtual。当你想通过基类类型的指针delete一个对象时,它被声明为虚拟,那么需要将基类的析构函数设为虚拟,以避免未定义的行为。

class A{ public: ~A(); }; //note:  ~A() is not virtual
class B : public A {};

A *pA = new B();

delete pA; //invokes undefined behavior, as ~A() is not declared virtual

在这种情况下,您需要将基类析构函数设为虚拟:

class A{ public: virtual ~A(); }; //note:  ~A() is virtual
class B : public A {};

A *pA = new B();

delete pA; //Well defined behavior, as ~A() is declared virtual

在这种情况下,delete pA 将首先调用~B()(因为pA 指向B 类型的对象),然后它会调用~A()

【讨论】:

    【解决方案3】:

    析构函数并不总是声明为virtual

    如果一个类打算用作 public 基类,则 virtual 析构函数很重要。如果没有 virtual 析构函数,以下内容将不起作用:

    class A {public: ~A() {} };
    
    class B : public A {public: ~B() {}};
    
    A *a = new B;
    delete a;
    

    最后一行不会做正确的事,因为它不会调用B的析构函数。要更正此问题,A 的析构函数必须是 virtual

    请注意,这仅对您打算派生的类以及您打算让用户使用public 继承的类是必需的。大多数类通常不是这种情况。

    【讨论】:

      【解决方案4】:

      以下链接给出了最佳描述
      Link

      【讨论】:

      • 链接真的很好解决了我的疑问
      【解决方案5】:

      就继承而言,将析构函数设为基类的虚函数是有意义的,这样当通过基类指针调用特定类的析构函数时,适当的类对象就会被释放。因此,它遵循相反的继承顺序。 (孩子对父母)

      【讨论】:

        猜你喜欢
        • 2015-11-12
        • 2012-02-24
        • 2015-08-09
        • 2011-10-29
        • 2011-09-30
        • 2011-08-02
        • 2018-07-03
        • 2021-07-17
        • 2011-04-18
        相关资源
        最近更新 更多