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 |
就來用一個程式題來說明這些通路權限:
<span style="font-size:18px;">#include <iostream>
using 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;
}</span>
對于派生類的對象對其基類的成員通路性歸結為:
1,對于公有繼承方式來說,隻有基類的公有成員可被派生類對象通路,其他成員不可。
2,對于私有繼承方式和保護繼承方式來說,基類中所有成員都不能被派生類的對象通路。