1. 程式人生 > >C++使用virtual解構函式的原因

C++使用virtual解構函式的原因

1.如果基類中的成員函式是virtual型別的,其繼承類中相應的函式也是virtual型別,並且基類物件的引用指向繼承類物件時,
基類就可以呼叫繼承類函式,否則呼叫的是基類函式

class base

{

public:

virtual void fun(){ printf("base fun");}

};

  

class derived:public base

{

public:

void fun(){ printf("derived fun");}

};

  

derived der;

base &b = der;

//或者base *b = &der;

b.fun(); //或者b->fun(); 輸出的結果是 derived fun;呼叫的是子類的函式

//注意是在基類引用指向子類物件時才行; base b = der; 這個不行

2.virtual解構函式有什麼用? 如

base * get()
{
derived * p = new derived;
return p;
}
這樣base類就可以呼叫子類函式,最後要釋放new出來的記憶體
base *ba = get();
delete ba;
因為base類的解構函式不是virtual型別的,所以delete ba這一邊中只能呼叫基類的解構函式,無法呼叫子類的解構函式,
這可能導致子類記憶體無法釋放完畢
所以在基類中的解構函式定義為virtual型別,這樣delete ba時就可以呼叫子類的解構函式

3.關於虛擬函式表的詳細介紹,看連結 http://blog.csdn.net/haoel/article/details/1948051

 

#include <iostream>

using namespace std;

  

class base

{

   public:

    void fun1(){ cout << "base fun1" << endl;}

    

virtual void fun2(){ cout << "base fun2" << endl;}

    virtual ~base(){ cout << "base的解構函式 " << endl;} //注意virtual的解構函式的意義

};

  

class derived:public base

{

   public:

    void fun1(){ cout << "derived fun1" << endl;}

    virtual void fun2(){ cout << "derived fun2" << endl;}

    virtual ~derived(){ cout << "derived的解構函式" << endl;}

};

  

base* get()

{

    derived *der = new derived;

    return der;

}

  

int _tmain(int argc, _TCHAR* argv[])

{

    derived d;

    //base   * b = &d;

    base  *b = get();

        b->fun1();

        b->fun2();

    delete b;

    return 0;

}