Cpp Constructor Destructor Calling Order

Source Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>

class Base_Member{
public:
    Base_Member(){
        std::cout << "      Base_Member Constructor" << std::endl;
    }
    ~Base_Member(){
        std::cout << "      Base_Member Destructor" << std::endl;
    }
};

class Derived_Member{
public:
    Derived_Member(){
        std::cout << "      Derived_Member Constructor" << std::endl;
    }
    ~Derived_Member(){
        std::cout << "      Derived_Member Destructor" << std::endl;
    }
};


class Base{
public:
    Base(){
        std::cout << "      Base Constructor" << std::endl;
    }
    virtual ~Base(){
        std::cout << "      Base Destructor" << std::endl;
    }
private:
    Base_Member bm;
};

class Derived : public Base{
public:
    Derived(){
        std::cout << "      Derived Constructor" << std::endl;
    }
    ~Derived(){
        std::cout << "      Derived Destructor" << std::endl;
    }
private:
    Derived_Member dm;
};

int main(){
    //派生类指针指向派生类对象
    std::cout << "------派生类指针指向派生类对象------" << std::endl;
    Derived* pDerived = new Derived();
    delete pDerived;
    std::cout << std::endl;

    //派生类指针不可以指向基类对象

    //基类指针指向基类对象
    std::cout << "------基类指针指向基类对象------" << std::endl;
    Base* pBase1 = new Base();
    delete pBase1;
    std::cout << std::endl;

    //基类指针指向派生类对象
    std::cout << "------基类指针指向派生类对象------" << std::endl;
    Base* pBase2 = new Derived();
    delete pBase2;
    std::cout << std::endl;
}

Output

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
------派生类指针指向派生类对象------
      Base_Member Constructor
      Base Constructor
      Derived_Member Constructor
      Derived Constructor
      Derived Destructor
      Derived_Member Destructor
      Base Destructor
      Base_Member Destructor

------基类指针指向基类对象------
      Base_Member Constructor
      Base Constructor
      Base Destructor
      Base_Member Destructor

------基类指针指向派生类对象------
      Base_Member Constructor
      Base Constructor
      Derived_Member Constructor
      Derived Constructor
      Derived Destructor
      Derived_Member Destructor
      Base Destructor
      Base_Member Destructor
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy