概念:类继承—公有继承、私有继承、保护继承
一、公有(Pulic)繼承
“繼承”是類的重要特性。A類繼承B類,我們稱B類為“基類”,也稱為“父類”,A類則相應地被稱為“派生類”或“子類”。A類繼承了B類之后,A類就具有了B類的部分成員。那么,究竟從基類那兒得到了哪些成員,這由2方面決定,①繼承方式,②基類成員的訪問權限(即public/private/protected)。
繼承有三種方式,即公有(Public)繼承、私有(Private)繼承、保護(Protected)繼承。我們先討論最常用的公有繼承。公有繼承就是將基類的公有成員變為自己的公有成員,基類的保護成員變為自己的保護成員。
#include <iostream>
#include <string>
using namespace std;
class CBase {
string name;
int age;
public:
string getName() {
return name;
}
int getAge() {
return age;
}
protected:
void setName(string s) {
name = s;
}
void setAge(int i) {
age = i;
}
};
class CDerive : public CBase { //用“public”指定公有繼承
public:
void setBase(string s, int i) {
setName(s); //調用基類的保護成員
setAge(i); //調用基類的保護成員
//調用基類的私有成員
//cout << name <<" " << age << endl; //編譯出錯
}
};
int main ( )
{
CDerive d;
d.setBase("abc", 100);
//調用基類的私有成員
//cout << d.name <<" " << d.age << endl; //編譯出錯
//調用基類的公有成員
cout << d.getName() <<" " << d.getAge() << endl;
//調用基類的保護成員
//d.setName("xyz"); //編譯出錯
//d.setAge(20); //編譯出錯
return 0;
}
從上面的例子可以看出,對于公有繼承,基類的成員能否訪問,有以下特征:
基類的私有成員:在派生類和外部都不可以訪問。
基類的保護成員:在派生類可以訪問,在外部不可以訪問。
基類的公有成員:在派生類和外部都可以訪問。
二、私有(Private)繼承
私有繼承是將基類的公有成員和保護成員變成自己的私有成員,而基類的私有成員在派生類里本身就不能訪問。
#include <iostream>
#include <string>
using namespace std;
class CBase {
string name;
int age;
public:
string getName() {
return name;
}
int getAge() {
return age;
}
protected:
void setName(string s) {
name = s;
}
void setAge(int i) {
age = i;
}
};
class CDerive : private CBase { //用“private”指定私有繼承,private可以省略
public:
void setBase(string s, int i) {
setName(s); //調用基類的保護成員
setAge(i); //調用基類的保護成員
//調用基類的私有成員
//cout << name <<" " << age << endl; //編譯出錯
}
string getBaseName() {
return getName(); //調用基類的公有成員
}
int getBaseAge() {
return getAge(); //調用基類的公有成員
}
};
int main ( )
{
CDerive d;
d.setBase("abc", 100);
//調用基類的私有成員
//cout << d.name <<" " << d.age << endl; //編譯出錯
//調用基類的公有成員
//cout << d.getName() <<" " << d.getAge() << endl; //編譯出錯
cout << d.getBaseName() <<" " << d.getBaseAge() << endl;
//調用基類的保護成員
//d.setName("xyz"); //編譯出錯
//d.setAge(20); //編譯出錯
return 0;
}
從上面的例子可以看出,對于私有繼承,基類的成員能否訪問,有以下特征:
基類的私有成員:在派生類和外部都不可以訪問。
基類的公有成員:在派生類可以訪問,在外部不可以訪問。
基類的保護成員:在派生類可以訪問,在外部不可以訪問。
三、保護(Protected)繼承
保護繼承是將基類的公有成員和保護成員變成自己的保護成員,而基類的私有成員在派生類里本身就不能訪問。
#include <iostream>
#include <string>
using namespace std;
class CBase {
string name;
int age;
public:
string getName() {
return name;
}
int getAge() {
return age;
}
protected:
void setName(string s) {
name = s;
}
void setAge(int i) {
age = i;
}
};
class CDerive : protected CBase { //用“private”指定私有繼承
public:
void setBase(string s, int i) {
setName(s); //調用基類的保護成員
setAge(i); //調用基類的保護成員
//調用基類的私有成員
//cout << name <<" " << age << endl; //編譯出錯
}
string getBaseName() {
return getName(); //調用基類的公有成員
}
int getBaseAge() {
return getAge(); //調用基類的公有成員
}
};
int main ( )
{
CDerive d;
d.setBase("abc", 100);
//調用基類的私有成員
//cout << d.name <<" " << d.age << endl; //編譯出錯
//調用基類的公有成員
//cout << d.getName() <<" " << d.getAge() << endl; //編譯出錯
cout << d.getBaseName() <<" " << d.getBaseAge() << endl;
//調用基類的保護成員
//d.setName("xyz"); //編譯出錯
//d.setAge(20); //編譯出錯
return 0;
}
從上面的例子可以看出,對于私有繼承,基類的成員能否訪問,有以下特征:
基類的私有成員:在派生類和外部都不可以訪問。
基類的公有成員:在派生類可以訪問,在外部不可以訪問。
基類的保護成員:在派生類可以訪問,在外部不可以訪問。
四、三種繼承方式的比較
從上面的結果來看,私有繼承和保護繼承作用完全一樣。仔細一想其實還是有區別,區別是如果派生類再一次去派生其它類時,對于剛才的私有繼承來說,再派生的類將得不到任何成員。而對于剛才的保護繼承,仍能夠得到基類的公有和保護成員。
總結
以上是生活随笔為你收集整理的概念:类继承—公有继承、私有继承、保护继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小鱼公式口诀
- 下一篇: 十指紧扣心相守唯美句子89句