天天看点

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;
}