虚析构函数与纯虚函数

虚析构函数

通过基类的指针删除派生类对象时,通常情况只调用基类的析构函数

但是,删除一个派生类对象时,应该先调用派生类的析构函数,然后调用基类的析构函数(构造时自顶向下,析构时自底向上)

这种情况会产生内存泄漏,最终导致系统应可用内存不足而崩溃

解决办法

把基类的析构函数声明为virtual,此时派生类的析构函数即使不声明为virtual也为virtual函数

在调用基类的指针删除派生类对象时,会先调用派生类的析构函数,最后调用基类的析构函数

一般方法

如果一个类定义了虚函数,那么析构函数也应该定义为虚函数

或者一个类打算作为基类使用,也应该讲析构函数定义为虚函数

纯虚函数与抽象类

包含纯虚函数的类叫抽象类,抽象类只能作为基类来派生新类使用,不能创建抽象类的对象

抽象类的指针和引用可以指向由抽象类派生出来的类的对象

class A;             //抽象类

A a;                  //错误   
A *pa;              //正确
pa = new A;      //错误

在抽象类的成员函数内可以调用虚函数,但是在构造函数或析构函数内部不能调用纯虚函数。(在成员函数内调用虚函数是多态,在构造函数和析构函数中调用虚函数不是多态)

如果一个类从抽象类派生而来,当且仅当它实现了基类中所有的纯虚函数,它才能成为非抽象类。

class A {
public:
    virtual void f() = 0;
    void g() {
        this->f();    //正确,this指针一定指向一个派生类
    }
    A() {              //此处不能用f()
    }
};

class B : public A {
public:
    void f() {
        cout << "B:f()" << endl;
    }
};

int main() {
    B b;
    b.g();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhp-purelove/p/9949595.html