1、認識繼承編程
什麼是繼承呢,就是一個對象有另外一個對象的全部特徵,而且在這些特徵上還有新的屬於本身的特徵,則一個對象就是另一個對象的繼承。好比兒子繼承父親的相貌以外還有本身的相貌特徵。在C++中,繼承是面向對象複用的重要手段。經過繼承定義一個類,它們的類型之間的關係建模,共享公有的東西,實現各自本質不一樣的東西。ide
2、繼承的做用函數
打個比方,你描述了狗這個對象,對於黑狗,只需描述狗是黑的這一特徵,並不須要再去把狗描述一遍。由於黑狗繼承了狗的全部特徵,而且擁有本身是「黑」的這一特徵。對於這樣的繼承,咱們能夠利用過去的類創建新的類,節省編程工做量,減小冗餘代碼。this
3、繼承關係spa
咱們都知道,在類中,有public,private,protected三種成員訪問限定符,對於繼承來的子類,它的成員又有怎樣的訪問限定呢?咱們經過一個表來講明一下。
對象
同時,咱們經過實例來看一下他們之間的相互繼承關係blog
class Base繼承
{get
public:it
Base()
{
cout<<"B()" <<endl;
}
~Base ()
{
cout<<"~B()" <<endl;
}
void ShowBase()
{
cout<<"_pri = " <<_pri<< endl;
cout<<"_pro = " <<_pro<< endl;
cout<<"_pub = " <<_pub<< endl;
}
private:
int _pri;
protected:
int _pro;
public:
int _pub;
};
class Derived:public Base
{
public:
Derived()
{
cout<<"D()"<<endl;
}
~Derived ()
{
cout<<"~D()"<<endl;
}
void ShowDerived()
{
cout<<"_pri = "<<_pri<<endl;
cout<<"_pro = "<<_pro<<endl;
cout<<"_pub = "<<_pub<<endl;
cout<<"_d_pri = "<<_d_pri<< endl;
cout<<"_d_pro = "<<_d_pro<< endl;
cout<<"_d_pub = "<<_d_pub<< endl;
}
private:
int _d_pri;
protected:
int _d_pro;
public:
int _d_pub;
};
對於代碼中的綠色的一行,顯然是不可以被編譯經過的,由於他在父類中的成員數據是private的,父類的私有成員在派生類中是不能被訪問的。
4、派生類的默認成員函數
派生類也是類,也擁有類的默認成員函數,構造函數,拷貝構造函數,析構函數,賦值運算符重載,取地址符重載,const修飾的取地址操做符重載。
在類中,構造函數有着調用順序,對於繼承關係中的構造函數調用順序又將是是怎樣的呢?咱們來看一下。
同時析構函數的調用順序以下圖
class B
{
public:
int data1;
};
class B1: virtual public B
{
public:
int data2;
};
class B2: virtual public B
{
public:
int data3;
};
class D:public B1, public B2
{
public:
void FunTest()
{
B1::data1 = 0x01;
data2 = 0x02;
B2::data1 = 0x03;
data3 = 0x04;
data4 = 0x05;
cout<<this<<endl;
cout<<&B1::data1<<endl;
cout<<&data2<<endl;
cout<<&B2::data1<<endl;
cout<<&data3<<endl;
cout<<&data4<<endl;
cout<<data1<<endl;
}
int data4;
};
int main()
{
cout<<sizeof(B)<<endl;
cout<<sizeof(B1)<<endl;
cout<<sizeof(B2)<<endl;
cout<<sizeof(D)<<endl;
D d;
d.FunTest();
return 0;
}
5、單繼承與多繼承
單繼承--一個子類只有一個直接父類時稱這個繼承關係爲單繼承
多繼承--一個子類有兩個或以上直接父類時稱這個繼承關係爲多繼承