1)為什麼要繼承
實現代碼複用。
在執行個體化一個衍生類別對象時,先調用基類建構函式,在調用衍生類別建構函式;
銷毀衍生類別對象時,解構函式調用順序正好相反
#include<iostream>#include<string>using namespace std;class Person{public: Person(){ cout << "Person()" << endl; } ~Person(){ cout << "~Person()" << endl; } void eat(){ cout << "eat()" << endl; } string m_strName; int m_iAge;};class Worker :public Person{public: Worker(){ cout << "Worker()" << endl; } ~Worker(){ cout << "~Worker()" << endl; } void worker(){ cout << "worker()" << endl; } int m_iSalary;};int main(){ Worker *pWorker = new Worker(); delete pWorker; pWorker = NULL; return 0;}
2)繼承方式
a.公有繼承
class A:public B
基類 public protected private衍生類別 public protected 無法訪問
b)保護繼承
class A:protected B
基類 public protected private衍生類別 protected protected 無法訪問
c)私人繼承
cladd A:private B
基類 public protected private衍生類別 private private 無法訪問
3)隱藏和覆蓋
父類 void f();
子類 void f();
當執行個體化子類對象時,只能訪問子類的f();隱藏了父類的f();
總結:父子關係 成員同名 隱藏
覆蓋是指衍生類別函數覆蓋基類函數,特徵是:
不同的範圍(分別位於衍生類別與基類);
函數名字相同;
參數相同;
基類函數必須有virtual關鍵字。
4)Is_a關係
eg:人類是基類,衍生類別為士兵和工人,士兵和工人都是人類。
衍生類別對象可以向基類對象轉換,反之不可以
5)多繼承和多重繼承
多重繼承 人類->士兵類->步兵類
多繼承 :一個衍生類別有多個基類
class Worker{};class Farmer{};class MigrantWorker:ppublic Worker.public Farmer{};預設情況下,以private繼承#include<iostream>#include<string>using namespace std;class Farmer{public: Farmer(string name="Jack"){ m_strName = name; cout << "Farmer()" << endl; } virtual ~Farmer(){ cout << "~Farmer()" << endl; } void sow();protected: string m_strName;};void Farmer::sow(){ cout << m_strName << endl; cout << "Farmer--souw()" << endl;}class Worker{public: Worker(string code="001"){ m_strCode = code; cout << "Worker()" << endl; } virtual ~Worker(){ cout << "~Worker()" << endl; } void carry(){ cout << m_strCode << endl; cout << "Worker--carry()" << endl; }protected: string m_strCode;};class MigrantWorker:public Farmer,public Worker{public: MigrantWorker(string name, string code); ~MigrantWorker(){ cout << "~MigrantWorker()" << endl; }};MigrantWorker::MigrantWorker(string name, string code) :Farmer(name), Worker(code){//建構函式與初始化列表順序一致 cout << "MigranWorker()" << endl;}int main(){ MigrantWorker *p = new MigrantWorker("huheqing", "112"); p->carry(); p->sow(); delete p; p = NULL; return 0;}
6)虛繼承
菱形繼承
既有多繼承又有多重繼承,存在資料冗餘問題
Class Worker:virtual public Person{
};
Class Farmer:virtual public Person{
};
Class MigranFarmer:public Worker,public Farmer{
};
注意:在多繼承或者多重繼承時,在執行個體化對象時,父類帶參數的建構函式的實參通過子類的建構函式初始化列表進行傳遞
#include<iostream>#include<string>using namespace std;class Person{public: Person(string color="blue"){ m_strColor = color; cout << "Person()" << endl; } virtual ~Person(){ cout << "~Person()" << endl; } void printColor(){ cout << m_strColor << endl; cout << "printColor()" << endl; }protected: string m_strColor;};class Farmer:virtual public Person{public: Farmer(string name = "Jack", string color = "blue"):Person(color){ m_strName = name; cout << "Farmer()" << endl; } virtual ~Farmer(){ cout << "~Farmer()" << endl; } void sow();protected: string m_strName;};void Farmer::sow(){ cout << m_strName << endl; cout << "Farmer--souw()" << endl;}class Worker:virtual public Person{public: Worker(string code = "001", string color = "blue") :Person(color){ m_strCode = code; cout << "Worker()" << endl; } virtual ~Worker(){ cout << "~Worker()" << endl; } void carry(){ cout << m_strCode << endl; cout << "Worker--carry()" << endl; }protected: string m_strCode;};class MigrantWorker:public Farmer,public Worker{public: MigrantWorker(string name, string code,string color); ~MigrantWorker(){ cout << "~MigrantWorker()" << endl; }};MigrantWorker::MigrantWorker(string name, string code,string color) :Farmer(name,color), Worker(code,color){//建構函式與初始化列表順序一致 cout << "MigranWorker()" << endl;}int main(){ MigrantWorker *p = new MigrantWorker("huheqing", "112","black"); p->carry(); p->sow(); delete p; p = NULL; return 0;}