繼承
繼承可以用一句話概括:繼承的本質就是代碼複用
類與類之間的關系是組合繼承。
繼承方式
總結:
1、外部隻能通路對象public的成員,protected和private的成員無法直接通路;
2、在繼承結構中,派生類從基類繼承過來的private的成員,但是派生類無法直接通路
3、protecte和private的差別?
在基類中定義的成員,想被派生類通路,但是不想被外部通路,那麼在基類中,把相關成員定義成protected保護的;如果派生類和外部都不打算通路,那麼在基類中,把相關成員定義成private私有的
4、預設的繼承方式是什麼?
派生類是class定義的,預設繼承方式是private私有的
struct定義的派生類,預設的繼承方式是public公用的
派生
類和類之間的關系主要有三種,分别是組合、繼承和代理。
class A
{
public:
int ma;
void fun()
{
cout << mb << endl;
}
protected:
int mb;
private:
int mc;//自己或者友元才可以通路私有成員
};
class B : public A
{
public:
int md;
protected:
int me;
private:
int mf;
};
int main()
{
return 0;
}//
Derive(int data)
:Base(data), mb(data)
{
cout << "Derive()" << endl;
}
派生類怎麼初始化基類繼承來的成員變量呢?
1、派生類可以繼承所有的成員(變量和方法),除構造函數和析構函數
解答(通過調用基類的構造函數
派生類的構造函數和析構函數,負責初始化和清理派生類部分
派生類從基類繼承來的成員的初始化和清理由基類的構造和析構函數負責
》》》派生類對象構造和析構的過程是:
1、派生類調用基類的構造函數,初始化基類繼承來的成員
2、調用派生類自己的構造函數,初始化派生類自己特有的成員
3、析構時,先調用派生類的析構函數,釋放派生類成員可能占用的外部資源
4、調用基類的析構函數,釋放派生類記憶體中從基類繼承來的成員
基類與派生類
代碼如下:
class Base
{
public:
Base(int data = 10) :ma(data) { cout << "base()" << endl; }
~Base()
{
cout << "~base()" << endl;
}
void show() { cout << "Base::show()" << endl; }//1
void show(int) { cout << "Base::show(int)" << endl; }//2
protected:
int ma;
};
class Derive :public Base
{
public:
Derive(int data = 20)
:Base(data), mb(data) {
cout << "Derive()" << endl;
}
~Derive()
{
cout << "~Derive()" << endl;
}
void show() { cout << "Derive::show()" << endl; }//3
private:
int mb;
};
int main()
{
return 0;
}//
先來介紹三種關系
重載、隐藏、覆寫
1、重載的關系
一組函數要重載,必須處在同一個作用域當中;而且函數名字相同,參數清單不同
2、隐藏(作用域的隐藏)的關系
在繼承結構當中,派生類的同名成員,把基類的同名成員給隐藏調用了
派生類優先在自己作用域内找函數,如果沒有才去基類裡面找
3、覆寫的關系
基類和派生類的方法、傳回值,函數名和參數清單都相同,且基類的方法是虛函數,那麼派生類的方法就自動處理為虛函數,他們之間成為覆寫關系
總結:在繼承結構中進行上下的類型轉換,預設隻支援從下到上的類型轉換
基類對象-》派生類對象 類型從上到下的轉換 不可以
派生類對象-》基類對象 類型從下到上的轉換 可以
基類指針(引用)指向派生類對象 類型從下到上的轉換 可以
派生類對象(引用)指向基類對象 類型從上到下的轉換 不可以