作為繼承,主要有三種:公有繼承,私有繼承(默認繼承方式),保護繼承。
公有繼承:
基類中的公有成員在派生類中仍公有;
基類中的保護成員在派生類中仍保護;
基類中的私有成員在派生類中不可見,僅基類可見。
私有繼承:
基類中的公有成員在派生類中為私有;
基類中的保護成員在派生類中為私有;
基類中的私有成員在派生類中不可見,僅基類可見。
保護繼承:
基類中的公有成員在派生類中為保護;
基類中的保護成員在派生類中為保護;
基類中的私有成員在派生類中不可見,僅基類可見。
通過繼承機制,派生類繼承了基類的成員,所繼承的成員只屬于派生類,即基類和派生類各有一份這樣的成員,這點很重要。
接下來,我們不慌看繼承,回到類來看:(個人理解所謂可見性即是調(diào)用權(quán)限?。?BR> #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)用,說明它們的調(diào)用權(quán)限僅屬于類,即對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類不可見,不能訪問.
b.get();//ok! 由于x是私有的,所以派生類不可見,但能間接訪問.
/* b.compare(a); */ //wrong!這個是我之前一直沒想通的,但是現(xiàn)在清楚了。因為對象a調(diào)用的get_x()權(quán)限僅屬于A,所以對B不可見。
return 0;
}
于是我們知道,在派生類不可見的成員并不是不可訪問的,可以通過間接的方式訪問!
總結(jié)上面的,做了一張表:(注:派生類中成員的可見性是指繼承來的和自身添加的成員。) 成員
基類(類)
派生類
main
私有數(shù)據(jù)
可見
不可見
不可見
私有函數(shù)
可見
不可見
不可見
保護數(shù)據(jù)
可見
可見
不可見
保護函數(shù)
可見
可見
不可見
公有數(shù)據(jù)
可見
可見
可見
公有函數(shù)
可見
可見
可見
公有繼承:
基類中的公有成員在派生類中仍公有;
基類中的保護成員在派生類中仍保護;
基類中的私有成員在派生類中不可見,僅基類可見。
私有繼承:
基類中的公有成員在派生類中為私有;
基類中的保護成員在派生類中為私有;
基類中的私有成員在派生類中不可見,僅基類可見。
保護繼承:
基類中的公有成員在派生類中為保護;
基類中的保護成員在派生類中為保護;
基類中的私有成員在派生類中不可見,僅基類可見。
通過繼承機制,派生類繼承了基類的成員,所繼承的成員只屬于派生類,即基類和派生類各有一份這樣的成員,這點很重要。
接下來,我們不慌看繼承,回到類來看:(個人理解所謂可見性即是調(diào)用權(quán)限?。?BR> #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)用,說明它們的調(diào)用權(quán)限僅屬于類,即對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類不可見,不能訪問.
b.get();//ok! 由于x是私有的,所以派生類不可見,但能間接訪問.
/* b.compare(a); */ //wrong!這個是我之前一直沒想通的,但是現(xiàn)在清楚了。因為對象a調(diào)用的get_x()權(quán)限僅屬于A,所以對B不可見。
return 0;
}
于是我們知道,在派生類不可見的成員并不是不可訪問的,可以通過間接的方式訪問!
總結(jié)上面的,做了一張表:(注:派生類中成員的可見性是指繼承來的和自身添加的成員。) 成員
基類(類)
派生類
main
私有數(shù)據(jù)
可見
不可見
不可見
私有函數(shù)
可見
不可見
不可見
保護數(shù)據(jù)
可見
可見
不可見
保護函數(shù)
可見
可見
不可見
公有數(shù)據(jù)
可見
可見
可見
公有函數(shù)
可見
可見
可見