一、繼承中的對象模型分析
1、繼承代碼示例
下面有 3 個類 , 分別是 A 類 , B 類 , C 類 ;
- A 類是 基類 ;
- B 類 公有繼承 A 類 , 并定義了新的 成員變量 y ;
- C 類 公有繼承 B 類 , 并定義了新的 成員變量 z ;
class A {
public:
int x;
};
class B : public A {
public:
int y;
};
class C : public B {
public:
int z;
};
分別定義上述 3 個類的對象 ,
A objA;
B objB;
C objC;
2、基類與派生類內存模型
上述 3 個對象的內存模型如下 :
- A 類對象 objA 中有一個成員 int x , 在內存中只有一個 int 類型的空間 ;
- B 類對象 objB 中 , 除了繼承自 A 類的 int x 成員 , 還有一個自己的 int y 成員 , 在內存中是 2 個 int 類型的空間 ;
- C 類對象 objC 中 , 除了繼承自 B 類的 int x 和 int y 成員 , 還有一個自己的 int z 成員 , 在內存中是 3 個 int 類型的空間 ;
3、問題引入 - 派生類對象構造函數(shù)和析構函數(shù)調用
上述 繼承 的過程中 , 每一層繼承 , 都繼承了上一級 父類的 成員變量 , 同時自己也定義了新的成員變量 ;
- 在 派生類對象 構造時 , 構造函數(shù)如何進行調用 ;
- 在 派生類對象 析構時 , 析構函數(shù)如何進行調用 ;
本篇博客開始討論上述問題 ;
4、完整代碼示例 - 派生類對象內存模型
#include "iostream"
using namespace std;
class A {
public:
int x;
};
class B : public A {
public:
int y;
};
class C : public B {
public:
int z;
};
int main() {
A objA;
B objB;
C objC;
// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行
system("pause");
return 0;
}
二、繼承中的構造函數(shù)和析構函數(shù)
1、子類構造函數(shù)與析構函數(shù)調用順序
繼承中的構造函數(shù)和析構函數(shù) :
-
子類構造 : 子類對象 進行 構造 時 , 需要調用 父類 的 構造函數(shù) 對 繼承自父類的 成員變量 進行 初始化 操作 ; 構造函數(shù) 調用順序如下 :
- 構造時 , 先調用 父類 的構造函數(shù) , 構造繼承自父類的成員 ;
- 然后 , 再調用 子類 的 構造函數(shù) , 構造 子類 自己定義的成員 ;
-
子類析構 : 子類對象 進行 析構 時 , 需要調用 父類 的 析構函數(shù) 對 繼承自父類的 成員變量 進行 析構 操作 ; 析構函數(shù)調 用順序如下 :
- 析構時 , 先 調用 子類 的 析構函數(shù) , 析構 子類 自己的成員 ;
- 然后 , 再調用 父類 的 析構函數(shù) , 析構 繼承自父類的成員 ;
2、子類構造函數(shù)參數(shù)列表
如果 父類 的 構造函數(shù) 有 參數(shù) , 則 需要再 子類 的 初始化列表中 顯示調用 該有參構造函數(shù) ;
如果 A 類有構造函數(shù) :
class A {
public:
A(int a)
{
this->x = a;
cout << "A 構造函數(shù)調用" << endl;
}
}
B 類 如果繼承 A 類 ,
- 如果 A 類有默認的構造函數(shù) , B 類的構造函數(shù)可以這么寫 , 不顯式調用 A 類的構造函數(shù) , 默認調用 A 類的 無參 默認構造函數(shù) ;
class B : public A {
public:
B(int b)
{
this->y = b;
cout << "B 構造函數(shù)調用" << endl;
}
}
- 如果 A 類 沒有 默認的構造函數(shù) , B 類的構造函數(shù) 必須 顯式調用 A 類的構造函數(shù) , 并傳入 A 類的構造函數(shù)參數(shù) ;
class B : public A {
public:
B(int a, int b) : A(a)
{
this->y = b;
cout << "B 構造函數(shù)調用" << endl;
}
}
3、代碼示例 - 繼承中的構造函數(shù)和析構函數(shù)
代碼示例 :
#include "iostream"
using namespace std;
class A {
public:
A(int a)
{
this->x = a;
cout << "A 構造函數(shù)調用" << endl;
}
~A()
{
cout << "A 析構函數(shù)調用" << endl;
}
public:
int x;
};
class B : public A {
public:
B(int a, int b) : A(a)
{
this->y = b;
cout << "B 構造函數(shù)調用" << endl;
}
~B()
{
cout << "B 析構函數(shù)調用" << endl;
}
public:
int y;
};
class C : public B {
public:
C(int a, int b, int c) : B(a, b)
{
this->z = c;
cout << "C 構造函數(shù)調用" << endl;
}
~C()
{
cout << "C 析構函數(shù)調用" << endl;
}
public:
int z;
};
int main() {
C obj(1, 2, 3);
cout << "obj.x = " << obj.x <<
" , obj.y = " << obj.y <<
" , obj.z = " << obj.z << endl;
// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行
system("pause");
return 0;
}
執(zhí)行結果 :文章來源:http://www.zghlxwxcb.cn/news/detail-721086.html
A 構造函數(shù)調用
B 構造函數(shù)調用
C 構造函數(shù)調用
obj.x = 1 , obj.y = 2 , obj.z = 3
請按任意鍵繼續(xù). . .
C 析構函數(shù)調用
B 析構函數(shù)調用
A 析構函數(shù)調用
文章來源地址http://www.zghlxwxcb.cn/news/detail-721086.html
到了這里,關于【C++】繼承 ⑦ ( 繼承中的對象模型分析 | 繼承中的構造函數(shù)和析構函數(shù) )的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!