標籤:構造順序 clu inf 方式 父類 name pac ima The
目錄
- C++之繼承(一)
- 1、繼承的基本文法
- 2、繼承的建構函式
- 3、繼承的構造順序
- 4、無參建構函式與預設建構函式
- 5、繼承方式
C++之繼承(一)1、繼承的基本文法
1.1、什麼是類的繼承?
- 類的繼承,是新的類從已有類那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為衍生類別或子類。
- 預設的繼承方式是 private 私人繼承。一個衍生類別可以同時有多個基類,這種情況稱為多重繼承,衍生類別只有一個基類,稱為單繼承。
單繼承衍生類別
class 衍生類別名: [繼承方式] 基類名
{
};
多繼承衍生類別
衍生類別名:public 基類名 1, public 基類名 2, ...,protected 基類名 n
{
};
2、繼承的建構函式
總參數列表:子類的形參和所有基類的形參總和內嵌子物件:本質組合類別
無內嵌對象的子類建構函式
衍生類別名::衍生類別名(總參列表):基類名(參數表)
{
}
//無內嵌子物件的子類建構函式#include <iostream>using namespace std;class A{ public: A(int a1) { cout<<"A()"<<endl; }};class B: public A{ public: B(int b1,int a1):A(a1) { cout<<"B()"<<endl; }};int main(){ B b(1,2); return 0;}//輸出://A()//B()
含內嵌子物件的子類
衍生類別名::衍生類別名(總參列表):基類名(參數表),內嵌子物件(參數表)
{
}
//含內嵌子物件的子類#include <iostream>using namespace std;class A{ public: A(int a1) { cout<<"A()"<<endl; }};class C{ public: C(int c1) { cout<<"C()"<<endl; }};class B: public A{ public: B(int b1,int a1,int c1):A(a1),MYC(c1) { cout<<"B()"<<endl; } private: C MYC;};int main(){ B b(1,2,3); return 0;}//輸出://A()//C()//B()
含內嵌子物件的多繼承子類
衍生類別名::衍生類別名(總參列表):
基類名 1(參數表 1),基類名(參數名 2)....基類名 n(參數名 n),
內嵌子物件 1(參數表 1),內嵌子物件 2(參數表 2)...內嵌子物件 n(參數表 n)
{
};
//含內嵌子物件的多繼承子類#include <iostream>using namespace std;class A{ public: A(int a1) { cout<<"A()"<<endl; }};class C{ public: C(int c1) { cout<<"C()"<<endl; }};class D{ public: D(int d1) { cout<<"D()"<<endl; }};class B:public A,public C{ public: B(int b1,int a1,int c1,int d1):A(a1),C(c1),myd(d1) { cout<<"B()"<<endl; } private: D myd;};int main(){ B b(1,2,3,4); return 0;}//輸出://A()//C()//D()//B()
3、繼承的構造順序
多繼承的構造順序
//多繼承的構造順序#include <iostream>using namespace std;class A{ public: A(int a1) { cout<<"A()"<<endl; }};class C{ public: C(int c1) { cout<<"C()"<<endl; }};class B:public A,public C{ public: B(int b1,int a1,int c1):A(a1),C(c1) //C(c1),A(c1) 程式輸出會有何不一樣呢? 答:參數列表順序改變無影響 { cout<<"B()"<<endl; }};int main(){ B b(1,2,3); return 0;}//輸出://A()//C()//B()
多內嵌子物件的構造順序
//多內嵌子物件的構造順序#include <iostream>using namespace std;class A{ public: A(int a1) { cout<<"A()"<<endl; }};class C{ public: C(int c1) { cout<<"C()"<<endl; }};class B{ public: B(int b1,int a1,int c1):MYA(a1),MYC(c1) //MYA(a1),MYC(c1)程式輸出會有何不一樣呢? 答:參數列表順序改變無影響 { cout<<"B()"<<endl; } private: C MYC; A MYA;};int main(){ B b(1,2,3); return 0;}//輸出://C()//A()//B()
3.1、繼承類構造順序總結
a、總的建構函式的調用順序
構造順序依次為:基類、內嵌子物件、衍生類別
b、多繼承的基類的建構函式執行順序為
class A: public b ,public c 重要:決定構造順序{ A():c(),c(),b() //無任何影響 { }}總結: 基類的構造順序僅與子類繼承時的繼承順序有關,與建構函式的參數列表順序無關。 該樣本構造順序依次為:b c a。
class B{}class C{}class A{ A():c1(),b1() //無任何影響 { } private: 重要:決定構造順序 B b1; C c1; }總結: 內嵌子物件的構造順序僅與子類執行個體化對象的先後有關,與建構函式的參數列表順序無關。 該樣本構造順序依次為:b c a。
4、無參建構函式與預設建構函式
//樣本1#include <iostream>using namespace std;class A{ public: A() { cout<<"A()"<<endl; }};class C{ public:};int main(){ A a; C c;}//輸出://A()
//樣本2:#include <iostream>using namespace std;class A{ public: A() { cout<<"A()"<<endl; }};class C{ public:};class B:public A,public C{ public: B(int b1,int a1,int c1,int d1) { cout<<"B()"<<endl; }};int main(){ B b(1,2,3,4); return 0;}//輸出://A()//B()
4.1、無參與預設構造總結
不同點
1、預設建構函式指系統預設的隱士建構函式,不體現在使用者代碼中。當定義對象時它會隱士調用,內部可能不做任何操作。
2、無參建構函式指使用者實現的建構函式,該函數沒有參數,一旦使用者定義對象時,該函數就會得到調用。
相同點
1、無參建構函式的類與預設建構函式的類定義對象時都一致,如:B b;
5、繼承方式
| 繼承方式 |
屬性 |
| public |
基類的公有成員和保護成員在衍生類別中保持原有訪問屬性,其私人成員仍為基類的私人成員。 |
| private |
基類的公有成員和保護成員在衍生類別中成了私人成員,其私人成員 仍為基類的私人成員。 |
| protected |
基類的公有成員和保護成員在衍生類別中成了保護成員,其私人成員仍為基類的私人成員。 |
| 原基類屬性 |
public |
protected |
private |
| 子類繼承方式 |
public |
public |
public |
| 基類成員在子類屬性 |
public |
protected |
invisible |
C++之繼承(一)