天天看點

C++ 中基類及派生類中繼承成員通路權限

#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 CPublicDerive : public CBase { //用 public 指定公有繼承
public:
void setBase(string s, int i) {
setName(s); //調用基類的保護成員
setAge(i); //調用基類的保護成員
//調用基類的私有成員
//cout << name << " " << age << endl; //編譯出錯
}
};
class CProtectDerive : protected CBase { //用 protected 指定保護繼承
public:
void setBase(string s, int i) {
setName(s); //調用基類的保護成員
setAge(i); //調用基類的保護成員
//調用基類的私有成員
//cout << name << " " << age << endl; //編譯出錯
}
string getBaseName() {
return getName(); //調用基類的公有成員
}
int getBaseAge() {
return getAge(); //調用基類的公有成員
}
};
class CPrivateDerive : 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 ( )
{
// 公有繼承
CPublicDerive cpublic;
cpublic.setBase("public", 1);
//調用基類的私有成員
//cout << cpublic.name << " " << cpublic.age << endl; //編譯出錯
//調用基類的公有成員
cout << cpublic.getName() << " " << cpublic.getAge() << endl;
//調用基類的保護成員
//cpublic.setName("xyz"); //編譯出錯
//cpublic.setAge(20); //編譯出錯
// 保護繼承
CProtectDerive cprotect;
cprotect.setBase("protect", 2);
//調用基類的公有成員
//cout << cprotect.getName() << " " << cprotect.getAge() << endl; //編譯出錯
cout << cprotect.getBaseName() << " " << cprotect.getBaseAge() << endl;
//調用基類的保護成員
//cprotect.setName("xyz"); //編譯出錯
//cprotect.setAge(20); //編譯出錯
// 私有繼承
CPrivateDerive cprivate;
cprivate.setBase("private", 3);
//調用基類的公有成員
//cout << cprivate.getName() << " " << cprivate.getAge() << endl; //編譯出錯
cout << cprivate.getBaseName() << " " << cprivate.getBaseAge() << endl;
//調用基類的保護成員
//cprivate.setName("xyz"); //編譯出錯
//cprivate.setAge(20); //編譯出錯
// 隐式類型轉換
CBase &cbase = cpublic;
// cbase.setName("xyz"); //編譯出錯
// cbase.setAge(20); //編譯出錯
cout << cbase.getName() << " " << cbase.getAge() << endl;
return 0;
}