1. 程式人生 > >C++基類子類的解構函式

C++基類子類的解構函式

基類的解構函式不為虛擬函式

class Base {
public:
    Base(int a = 0) {
        cout << "Base default constructor" << endl;
        p = new int(a);
    }
    ~Base() {
        cout << "Base destructor" << endl;
        if (nullptr != p) {
            delete p;
            p = nullptr;
        }
    }
private
: int *p; }; class Inherit : public Base { public: Inherit(int b = 0) { cout << "Inherit default constructor" << endl; q = new int(b); } ~Inherit() { cout << "Inherit destructor" << endl; if (nullptr != q) { delete q; q = nullptr
; } } private: int *q; };

基類對派生類及物件不需要進行操作時。

int main(void)
{
    Base *b = new Base(2);
    delete b;
    b = nullptr;
    return 0;
}

  這時不能定義虛擬函式,因為這樣會增加記憶體開銷。當類裡面有定義虛擬函式時,編譯器會給類增加一個虛擬函式表,裡面來存放虛擬函式指標,這樣就增加了類的儲存空間。只有當一個類被用來作為基類的時候,才把解構函式寫成虛擬函式。

基類的解構函式為虛擬函式

class Base {
public
: Base(int a = 0) { cout << "Base default constructor" << endl; p = new int(a); } virtual ~Base() { cout << "Base destructor" << endl; if (nullptr != p) { delete p; p = nullptr; } } private: int *p; }; class Inherit : public Base { public: Inherit(int b = 0) { cout << "Inherit default constructor" << endl; q = new int(b); } ~Inherit() { cout << "Inherit destructor" << endl; if (nullptr != q) { delete q; q = nullptr; } } private: int *q; };

示例

int main(void)
{
    Base *b = new Inherit(3);
    delete b;
    b = nullptr;
    return 0;
}