繼承(inheritance) 一個類能從另一個類里面派生(derived),這個類叫基類(base class)。 ★派生類繼承基類除構造函數(shù)、析構函數(shù)和賦值函數(shù)之外的所有成員。 Base(父類、基類)---->derived(子類、派生類) derived = base part + appendant part //派生類=基類部分+附加部分; ★基類的私有成員不能被派生類訪問,只能通過基類的公有成員來訪問。 例: class A { private: funcA(); public: funcB(){funcA();}; }; class B->A { }; class C { private: int c; public: int getC() {return c;} int f(int, int){cout<<c<<endl;} //基類的函數(shù)f(int, int); }; class D-->c { private: int d; public; int getD() {return d;} foo() {d=c;} //c為基類私有成員,不可見,所以不能直接用c賦值給d; foo() {d=getC();} //getC()為基類公有部分,可以用這種方法把c的值賦給d; int f(int, int){cout<<d<<endl;} //派生類的f(int, int)覆蓋了基類的f(int, int); }; C c1; c1.f(int, int); //輸出c的值; D d1; d1.f(int, int); //輸出d的值; d1.C::f(int, int); //輸出c的值; C* pc=&c1; pc->f(int, int); //輸出c的值; D* pd=&d1; pd->f(int, int); //輸出c的值; B類成員不能直接訪問funcA(),只能通過funcB()來訪問funcA()。 ★子類可以定義一個和基類同名、同參數(shù)、同返回值的成員函數(shù),派生類會覆蓋基類函數(shù),覆蓋(overrides)是一類特殊的重載。 ★由C類派生出D類,C類自身無任何變化。 例: C c1; c1.f(int, int); //輸出c的值; D d1; d1.f(int, int); //輸出d的值; C* pc=&c1; pc->f(int, int); //輸出c的值; D* pd=&d1; pd->f(int, int); //輸出c的值; ★由于子類會繼承基類部分,想調(diào)用基類必須使用域作用運算符。 例: d1.C::f(int, int); //輸出c的值; ★繼承的寫法: 例: class Derived:public Base { }; ★保護(protected):一個類的保護成員只能被他的成員函數(shù)和友元函數(shù)訪問,不能被別人訪問。一個類的保護部分不能被子類對象訪問,只能通過成員函數(shù)訪問。【在公有繼承的情況下,基類的保護成員可以被子類的成員函數(shù)訪問。】 例: class Base { private: int a1; public: int a2; protected: int a3; }; class D:public Base { public: print(){ cout<<a1<<endl; //error; cout<<a2<<endl; //ok; cout<<a3<<endl; //ok; } }; D d; d.a1 //error; d.a2 //ok; d.a3 //error; ★★★三種繼承方式: ●基類成員的訪問權限在子類里只能維持原樣或者降低,不能提升。 ①公有繼承:(最常使用)派生類的基類部分權限不變; 例: class Derived : public Base{}; ②私有繼承:派生類的基類部分都是私有; 例: class Derived : private Base{}; ③保護繼承:派生類的基類部分的公有成員和保護成員為保護成員,私有部分權限不變(還是私有); 例: class Derived : protected Base{}; 一重繼承:一個父類一個子類; 多重繼承:一個爺爺類,一個父類,一個子類或者更多。 ▲子類中繼承來的基類部分的私有不能直接被子類訪問,但是通過私有繼承變成私有的可以被子類訪問。
|