C++語言中,通過繼承的機制,可以利用已有的類型來定義新的類型。所定義的新類型擁有原來類型的屬性,同時還具有新的屬性。我們稱已存在的用來生成新的類型的類稱為基類。而由已存在的類派生出來的新類為派生類。派生類繼承了基類,派生類中擁有基類中所有成員,並且派生類本身還擁有它自己的新成員。派生類可以只從一個基類中派生,也可以聰哥多個基類中派生。
在使用class定義派生類時,默認的繼承方式是私有繼承。
繼承的三種方式:
1,公有繼承方式(public)
特點是基類中的非私有成員在派生類中保持同樣的訪問權限,即基類中的public成員在派生類中仍為public成員,基類中的protected成員在派生類中仍為protected成員。
2,私有繼承方式(private)
特點是基類中的非私有成員,不論是public成員,還是protected成員,在派生類中都是private成員,而且它們都不能再被派生類的子類所訪問。
3,保護繼承方式(protected)
特點是基類中的public成員和protected成員在派生類中都是protected成員。
不同的繼承方式規定了基類中不同訪問權限的成員在派生類中有不同的訪問權限,在三種繼承方式中,基類的私有成員派生類都不可以訪問。
對於不同的繼承方式,基類中的各種不同訪問權限的成員在派生類中的訪問權限如下表:
基類成員\繼承方式 public private protected public public private protected private 不可訪問 不可訪問 不可訪問 protected protected private protected
就來用一個程序題來說明這些訪問權限:
#includeusing namespace std; class Base { public: int a1; protected: int a2; private: int a3; }; class D1:public Base//公有繼承基類Base { public: void test() { a1=10;//可以,a1為public a2=20;//可以,a2為protected a3=30;//不可以 } }; class D11:public D1//公有繼承基類D1 { public: void test() { a1=5;//可以,a1為protected a2=6;//可以,a2為protected a3=7;//不可以訪問 } }; class D2:private Base//私有繼承基類Base { public: void test() { a1=8;//可以,b1為private a2=9;//可以,b2為private a3=10;//不可以訪問 } }; class D22:public D2//公有繼承基類D2 { public: void test() { a1=11;//不可以訪問 a2=12;//不可以訪問 a3=13;//不可以訪問 } }; class D3:protected Base//保護繼承基類Base { public: void test() { a1=15;//可以,a1為protected a2=16;//可以,a2為protected a3=17;//不可以訪問 } }; class D33:public D3//公有繼承基類D3 { public: void test() { a1=18;//可以,a1為protected a2=19;//可以,a2為protected a3=20;//不可以訪問 } }; int main() { D11 d1; d1.a1=1;//合法 d1.b2=2;//非法 d1.a3=3;//非法 D22 d2; d2.a1=4;//非法 d2.a2=5;//非法 d3.a3=6;//非法 D33 d3; d3.a1=7;//非法 d3.a2=8;//非法 d3.a3=9;//非法 return 0; }
對於派生類的對象對其基類的成員訪問性歸結為:
1,對於公有繼承方式來說,只有基類的公有成員可被派生類對象訪問,其他成員不可。
2,對於私有繼承方式和保護繼承方式來說,基類中所有成員都不能被派生類的對象訪問。