作為繼承,主要有三種:公有繼承,私有繼承(默認(rèn)繼承方式),保護(hù)繼承。
公有繼承:
基類中的公有成員在派生類中仍公有;
基類中的保護(hù)成員在派生類中仍保護(hù);
基類中的私有成員在派生類中不可見,僅基類可見。
私有繼承:
基類中的公有成員在派生類中為私有;
基類中的保護(hù)成員在派生類中為私有;
基類中的私有成員在派生類中不可見,僅基類可見。
保護(hù)繼承:
基類中的公有成員在派生類中為保護(hù);
基類中的保護(hù)成員在派生類中為保護(hù);
基類中的私有成員在派生類中不可見,僅基類可見。
通過(guò)繼承機(jī)制,派生類繼承了基類的成員,所繼承的成員只屬于派生類,即基類和派生類各有一份這樣的成員,這點(diǎn)很重要。
接下來(lái),我們不慌看繼承,回到類來(lái)看:(個(gè)人理解所謂可見性即是調(diào)用權(quán)限!)
#include《iostream》
using namespace std;
class A{
public:
void dump()const{....}
protected:
void set(){......}
private:
void get(){.......}
};
int main()
{
A a;
a.dump();//ok!
/* a.set(); */ //wrong!
/* a.get(); */ //wrong!
return 0;
}
函數(shù)set()和get()在main函數(shù)中都不能調(diào)用,說(shuō)明它們的調(diào)用權(quán)限僅屬于類,即對(duì)main不可見。同理可知dump().
下面我們以公有繼承為例:
#include《iostream》
using namespace std;
class A{
public:
void dump()const{....}
protected:
void get_x(){x++;}
private:
int x;
};
class B:public A
{
public:
void get(){ get_x();}
/* void get_y(){ y=x;} */
void compare(A &a){ a.get_x();}
protected:
void set(){...}
private:
int y;
};
int main()
{
B b;
A a;
/* b.get_y(); */ //wrong! x在B類不可見,不能訪問(wèn).
b.get();//ok! 由于x是私有的,所以派生類不可見,但能間接訪問(wèn).
/* b.compare(a); */ //wrong!這個(gè)是我之前一直沒(méi)想通的,但是現(xiàn)在清楚了。因?yàn)閷?duì)象a調(diào)用的get_x()權(quán)限僅屬于A,所以對(duì)B不可見。
return 0;
}
于是我們知道,在派生類不可見的成員并不是不可訪問(wèn)的,可以通過(guò)間接的方式訪問(wèn)!
總結(jié)上面的,做了一張表:(注:派生類中成員的可見性是指繼承來(lái)的和自身添加的成員。) 成員
基類(類)
派生類
main
私有數(shù)據(jù)
可見
不可見
不可見
私有函數(shù)
可見
不可見
不可見
保護(hù)數(shù)據(jù)
可見
可見
不可見
保護(hù)函數(shù)
可見
可見
不可見
公有數(shù)據(jù)
可見
可見
可見
公有函數(shù)
可見
可見
可見
公有繼承:
基類中的公有成員在派生類中仍公有;
基類中的保護(hù)成員在派生類中仍保護(hù);
基類中的私有成員在派生類中不可見,僅基類可見。
私有繼承:
基類中的公有成員在派生類中為私有;
基類中的保護(hù)成員在派生類中為私有;
基類中的私有成員在派生類中不可見,僅基類可見。
保護(hù)繼承:
基類中的公有成員在派生類中為保護(hù);
基類中的保護(hù)成員在派生類中為保護(hù);
基類中的私有成員在派生類中不可見,僅基類可見。
通過(guò)繼承機(jī)制,派生類繼承了基類的成員,所繼承的成員只屬于派生類,即基類和派生類各有一份這樣的成員,這點(diǎn)很重要。
接下來(lái),我們不慌看繼承,回到類來(lái)看:(個(gè)人理解所謂可見性即是調(diào)用權(quán)限!)
#include《iostream》
using namespace std;
class A{
public:
void dump()const{....}
protected:
void set(){......}
private:
void get(){.......}
};
int main()
{
A a;
a.dump();//ok!
/* a.set(); */ //wrong!
/* a.get(); */ //wrong!
return 0;
}
函數(shù)set()和get()在main函數(shù)中都不能調(diào)用,說(shuō)明它們的調(diào)用權(quán)限僅屬于類,即對(duì)main不可見。同理可知dump().
下面我們以公有繼承為例:
#include《iostream》
using namespace std;
class A{
public:
void dump()const{....}
protected:
void get_x(){x++;}
private:
int x;
};
class B:public A
{
public:
void get(){ get_x();}
/* void get_y(){ y=x;} */
void compare(A &a){ a.get_x();}
protected:
void set(){...}
private:
int y;
};
int main()
{
B b;
A a;
/* b.get_y(); */ //wrong! x在B類不可見,不能訪問(wèn).
b.get();//ok! 由于x是私有的,所以派生類不可見,但能間接訪問(wèn).
/* b.compare(a); */ //wrong!這個(gè)是我之前一直沒(méi)想通的,但是現(xiàn)在清楚了。因?yàn)閷?duì)象a調(diào)用的get_x()權(quán)限僅屬于A,所以對(duì)B不可見。
return 0;
}
于是我們知道,在派生類不可見的成員并不是不可訪問(wèn)的,可以通過(guò)間接的方式訪問(wèn)!
總結(jié)上面的,做了一張表:(注:派生類中成員的可見性是指繼承來(lái)的和自身添加的成員。) 成員
基類(類)
派生類
main
私有數(shù)據(jù)
可見
不可見
不可見
私有函數(shù)
可見
不可見
不可見
保護(hù)數(shù)據(jù)
可見
可見
不可見
保護(hù)函數(shù)
可見
可見
不可見
公有數(shù)據(jù)
可見
可見
可見
公有函數(shù)
可見
可見
可見

