基類和派生類解構函式呼叫順序的輸出例子
阿新 • • 發佈:2019-01-29
class A { public: A() { } ~A() { cout<<"~A"<<endl; } }; class B:public A { public: B(A &a):_a(a) { } ~B() { cout<<"~B"<<endl; } private: A _a; }; int main(void) { A a; //很簡單,定義a的時候呼叫了一次建構函式 B b(a); }
輸出為:
~B
~A
~A
~A
想知道其呼叫順序是怎樣的,可以類中新增成員變數name,在解構函式中打印出來,將程式碼改為下面的:
#include <iostream> #include <string> using namespace std; class A { public: A(string n = "default"):name(n) { } ~A() { cout << "~A:" << name << endl; } private: string name; }; class B :public A { public: B(A &a) :_a(a) { } ~B() { cout << "~B" << endl; } private: A _a; }; int main(void) { A a("a"); //很簡單,定義a的時候呼叫了一次建構函式 B b(a); }
輸出為:
第一行是呼叫B的解構函式
第二行是因為派生類中包含類A,要把a釋放,呼叫a的解構函式
第三行是呼叫基類的解構函式
第四行是因為A a呼叫解構函式
可以看到,函式中解構函式的呼叫與類的宣告順序相反的