【问题标题】:class has virtual functions and accessible non-virtual destructor类具有虚函数和可访问的非虚析构函数
【发布时间】:2011-08-15 05:22:55
【问题描述】:

我有两个班级:

class A {
public:
    virtual void somefunction() = 0;
};

class B : public A {
public:
    B();
    ~B();
    void somefunction();
};

B::B() {}

void B::somefunction() {
    //  some code
}

但是使用 g++ 我得到错误:

class A has virtual functions and accessible non-virtual destructor
class B has virtual functions and accessible non-virtual destructor

我不知道这个错误是什么......我在博客的某个地方读到这是一个编译器警告。我该如何解决这个问题?

【问题讨论】:

    标签: c++ virtual-destructor


    【解决方案1】:

    发生这种情况是因为您的基类A 没有虚拟析构函数。例如,如果您有以下代码:

    int main()
    {
        A* a = new B;
        delete a;
    }
    

    那么delete a 调用将无法调用B 的析构函数,因为A 不是虚拟的。 (它会泄露B 的所有资源。)你可以read more about virtual destructors here

    向你的基类添加一个虚拟析构函数,你应该没问题。

    class A
    {
    public:  
        virtual void somefunction() = 0;
        virtual ~A() = default;
    }
    

    【讨论】:

    • @SPB 这意味着它找不到你的析构函数的实现。如果你没有什么要真正摧毁的,那就写一个微不足道的。 A::~A() { } 应该这样做。
    【解决方案2】:

    给A类:

    virtual ~A() { }
    

    这样,如果您通过 A*delete 对派生类(例如 B)调用它们的自定义析构函数,它们仍然会被调用。

    【讨论】:

      【解决方案3】:

      如果一个类有虚函数,那么它的析构函数也应该是虚函数。你的有一个可访问的析构函数,但它不是虚拟的。

      【讨论】:

        【解决方案4】:

        作为拇指规则(恕我直言)或简而言之,基类中的 析构函数 必须是公共的和虚拟的或受保护的非虚拟的,以防止内存泄漏。这样做 析构函数 的派生类被调用,这可以防止每当持有派生 address/reference 的 Base pointer/reference 被删除时发生内存泄漏 .

        【讨论】:

          猜你喜欢
          • 2010-09-12
          • 2011-09-16
          • 2011-11-16
          • 2012-09-21
          • 2015-09-02
          • 2021-06-01
          • 1970-01-01
          • 2021-03-27
          • 2018-06-29
          相关资源
          最近更新 更多