virtual与析构函数

当一个类作为其他类的基类时,它的析构函数应该加上virtual。

#define debug qDebug()<<
class A
{
public:
    virtual ~A()
    {
        debug "A 析构";
    }
};

class B : public A
{
public:
    ~B()
    {
        debug "B 析构";
    }
};

int main(int argc, char *argv[])
{
    A * a = new B;
    delete a;
    debug "------------";
    a = new A;
    delete a;
}

当析构函数不加上virtual时,基类指针指向派生类delete时,派生类部分部分清除造成内存泄漏。加上virtual之后,当要调用基类的析构函数时,编译器会从虚函数表中找到要执行的正确的函数地址,即B的析构函数。

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/114308570