成员的访问属性 需要看根据下面的逻辑进行判定 :
如 : 在类外部调用 , 子类 保护继承 父类的 公有成员 , 调用失败 , 因为 父类的 公有成员 被 子类 保护继承 后 , 变为子类的 保护成员 , 只能在 子类内部 或 孙子类中调用 , 不可在类外部调用 ;
特别注意 : 私有继承 , 基类 的 公有成员 和 保护成员 变为 派生类的 私有成员 , 这两种成员在 派生类内部是可以访问的 , 在 类外部 不可访问 ;
public 公有继承 : 父类成员 在 子类 中 , 访问控制权限 不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ;
父类中的访问控制权限 如下变化 :
在下面的代码中 ,
基类 ( 父类 ) 中 , 定义了 公有变量 a , 保护变量 b , 私有变量 c ;
派生类 ( 子类 ) 中 , 分别访问了上述 3 个变量 ;
// 可访问 : 父类 公有成员 可以在任意位置访问
// 任意位置 : 类内部 , 子类内部 , 类外部
a = 0;
// 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
b = 0;
// 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
// 私有成员只能在本类中访问 , 子类 和 类外部无法访问
//c = 0;
类外部访问 派生类 ( 子类 ) 继承的 3 个变量 ;
// 基类中的公有成员
// 公有继承 子类中仍是 公有成员 , 可以在类外部访问
child.a;
// 不可访问 : 基类中的保护成员
// 公有继承 子类中仍是 保护成员 , 不可在类外部访问
//child.b;
// 不可访问 : 基类中的私有成员
// 公有继承 子类中仍是 私有成员 , 不可在类外部访问
//child.c;
代码示例 :
#include "iostream"
using namespace std;
class Parent {
public:
int a;
protected:
int b;
private:
int c;
};
// 子类 公有继承 父类
class Child : public Parent {
public:
void changeVar() {
// 可访问 : 父类 公有成员 可以在任意位置访问
// 任意位置 : 类内部 , 子类内部 , 类外部
a = 0;
// 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
b = 0;
// 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
// 私有成员只能在本类中访问 , 子类 和 类外部无法访问
//c = 0;
}
};
int main() {
Child child;
child.changeVar();
// 可访问 : 基类中的公有成员
// 公有继承 子类中仍是 公有成员 , 可以在类外部访问
child.a;
// 不可访问 : 基类中的保护成员
// 公有继承 子类中仍是 保护成员 , 不可在类外部访问
//child.b;
// 不可访问 : 基类中的私有成员
// 公有继承 子类中仍是 私有成员 , 不可在类外部访问
//child.c;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
protected 保护继承 : 父类成员 在 子类 中 , 访问控制权限 变为 protected , 基类的 公有成员 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ;
父类中的访问控制权限 如下变化 :
在下面的代码中 ,
基类 ( 父类 ) 中 , 定义了 公有变量 a , 保护变量 b , 私有变量 c ;
派生类 ( 子类 ) 中 , 分别访问了上述 3 个变量 ;
// 可访问 : 父类 公有成员 变为 保护成员
// 可在 类内部 , 子类内部 访问该成员
a = 0;
// 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
b = 0;
// 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
// 私有成员只能在本类中访问 , 子类 和 类外部无法访问
//c = 0;
类外部访问 派生类 ( 子类 ) 继承的 3 个变量 ;
// 不可访问 : 基类中的公有成员
// 保护继承 子类中仍是 公有成员 , 可以在类外部访问
//child.a;
// 不可访问 : 基类中的保护成员
// 保护继承 子类中仍是 保护成员 , 不可在类外部访问
//child.b;
// 不可访问 : 基类中的私有成员
// 保护继承 子类中仍是 私有成员 , 不可在类外部访问
//child.c;
代码示例 :
#include "iostream"
using namespace std;
class Parent {
public:
int a;
protected:
int b;
private:
int c;
};
// 子类 保护继承 父类
class Child : protected Parent {
public:
void changeVar() {
// 可访问 : 父类 公有成员 变为 保护成员
// 可在 类内部 , 子类内部 访问该成员
a = 0;
// 可访问 : 父类 保护成员 可以在 类内部 和 子类内部访问
b = 0;
// 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
// 私有成员只能在本类中访问 , 子类 和 类外部无法访问
//c = 0;
}
};
int main() {
Child child;
child.changeVar();
// 不可访问 : 基类中的公有成员
// 保护继承 子类中仍是 公有成员 , 可以在类外部访问
//child.a;
// 不可访问 : 基类中的保护成员
// 保护继承 子类中仍是 保护成员 , 不可在类外部访问
//child.b;
// 不可访问 : 基类中的私有成员
// 保护继承 子类中仍是 私有成员 , 不可在类外部访问
//child.c;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
private 私有继承 : 父类成员 在 子类 中 , 所有成员的访问控制权限 变为 private , 基类的 所有成员 都不可在子类中访问 ;
父类中的访问控制权限 如下变化 :
在下面的代码中 ,
基类 ( 父类 ) 中 , 定义了 公有变量 a , 保护变量 b , 私有变量 c ;
派生类 ( 子类 ) 中 , 分别访问了上述 3 个变量 ;
// 可访问 : 父类 公有成员 变为 子类 私有成员
// 可在 子类内部 访问该成员
a = 0;
// 可访问 : 父类 保护成员 变为 子类 私有成员
// 子类私有成员 可以在 子类内部访问
b = 0;
// 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
// 私有成员只能在本类中访问 , 子类 和 类外部无法访问
//c = 0;
类外部访问 派生类 ( 子类 ) 继承的 3 个变量 ;
// 不可访问 : 基类中的 公有成员 变为 派生类 私有成员
// 私有继承 子类中 的私有成员 , 不可在类外部访问
//child.a;
// 不可访问 : 基类中的 保护成员 变为 派生类 私有成员
// 私有继承 子类中 的私有成员 , 不可在类外部访问
//child.b;
// 不可访问 : 基类中的私有成员
// 私有继承 子类中仍是 私有成员 , 不可在类外部访问
//child.c;
代码示例 :
#include "iostream"
using namespace std;
class Parent {
public:
int a;
protected:
int b;
private:
int c;
};
// 子类 私有继承 父类
class Child : private Parent {
public:
void changeVar() {
// 可访问 : 父类 公有成员 变为 子类 私有成员
// 可在 子类内部 访问该成员
a = 0;
// 可访问 : 父类 保护成员 变为 子类 私有成员
// 子类私有成员 可以在 子类内部访问
b = 0;
// 报错 : “Parent::c”: 无法访问 private 成员(在“Parent”类中声明)
// 私有成员只能在本类中访问 , 子类 和 类外部无法访问
//c = 0;
}
};
int main() {
Child child;
child.changeVar();
// 不可访问 : 基类中的 公有成员 变为 派生类 私有成员
// 私有继承 子类中 的私有成员 , 不可在类外部访问
//child.a;
// 不可访问 : 基类中的 保护成员 变为 派生类 私有成员
// 私有继承 子类中 的私有成员 , 不可在类外部访问
//child.b;
// 不可访问 : 基类中的私有成员
// 私有继承 子类中仍是 私有成员 , 不可在类外部访问
//child.c;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}