C++ 類的構造與析構

簡單的繼承類

 
#ifndef virtualFuntion_hpp
#define virtualFuntion_hpp

#include <stdio.h>


class SValue {
public:
    SValue() {
        printf("SValue init\n");
    };
    ~SValue() {
        printf("SValue uninit\n");
    }
};

class CValue {
public:
    CValue() {
        printf("CValue init\n");
    };
    ~CValue() {
        printf("CValue uninit\n");
    }
};


class Shape{
    
public:
    Shape(){
        printf("Shape init\n");
    };
    virtual void draw() = 0;
    
    virtual ~Shape(){
        printf("Shape uninit \n");
    };
private:
    SValue _v;
};


class Cirle : Shape{
//    using Shape::Shape;
public:
    Cirle(){
        printf("Cirle init\n");
    };
    virtual void draw() {
        printf("Cirle draw cirle \n");
    };
    ~Cirle() {
        printf("Cirle uninit\n");
    };
private:
    CValue _v;
};


#endif /* virtualFuntion_hpp */

調用代碼

void test2(Shape *p) {
    p->draw();
    delete p;
}
int main()
{
    Cirle * p = new Cirle();
    test2((Shape*)p);
     
    return 0;
}

//C++編譯器使用的Mac自帶的 apple clang

打印

SValue init
Shape init
CValue init
Cirle init
Cirle draw cirle 
Cirle uninit
CValue uninit
Shape uninit 
SValue uninit

結論:

構造

  1. 基類或類成員先執行構造函數
  2. 基類優先執行構造函數
  3. 類執行構造函數

析構

  1. 類先調用析構函數
  2. 類成員調用析構函數
  3. 基類調用析構函數
  4. 基類的成員調用析構函數

疑惑:

C++之父在<<C++程序語言設計1-3>>中說的順序是成員構造函數在基類的構造函數調用之後
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章