一、继承相关概念
1、继承不包括构造与析构函数
子类 继承 父类 的 所有成员 , 包括 成员变量 和 成员方法 ;
子类 不会 继承 父类 的 构造函数 和 析构函数 ;
2、继承改变成员访问权限
父类 的 成员变量 和 成员方法 的 访问属性 , 在 子类 中 是可以调整的 ;
- 如 : private , protected , public 访问属性 , 在 子类中 可以发生改变 ;
二、访问控制权限回顾
1、访问权限
访问控制权限 :
- 公有成员 public : 公有成员可以被任何对象访问 , 包括类的外部和所有从该类派生的子类 ;
- 完全开放 : 如果一个成员被声明为公有 , 那么它可以在任何地方被访问 , 就像公共场所一样 ;
- 保护成员 protected : 保护成员可以被该类和所有派生子类访问 , 但不能被类的外部访问 ;
- 半开放 : 只有 在类内部 和 派生类 的成员可以访问它 ;
- 私有成员 private : 私有成员 只能被该类的成员函数访问 , 包括友元函数和派生类中的覆盖函数 ;
- 完全封闭 : 在 类的外部 和 子类 中都不能访问私有成员 ;
- private 是最安全的访问控制级别 , 任何试图直接访问私有成员的代码都会导致编译错误 ;
2、代码示例 - 访问权限
代码示例 :
代码语言:javascript复制class MyClass {
public:
// 公有成员
// 可以在任何位置访问
// 类内部 , 子类 , 类外部 都可以访问
int public_member;
protected:
// 保护成员
// 可以在类内部 , 子类 访问
// 类外部 不可以访问
int protected_member;
private:
// 私有成员
// 只能在 类内部 访问
// 子类 , 类外部 不可以访问
int private_member;
public:
// 针对共有成员变量的访问函数可以不写
void set_public_member(int value) {
public_member = value;
}
int get_public_member() {
return public_member;
}
// 保护变量 在外部只能通过共有的成员函数进行访问
void set_protected_member(int value) {
protected_member = value;
}
int get_protected_member() {
return protected_member;
}
// 私有变量只能通过共有的成员函数进行访问
void set_private_member(int value) {
private_member = value;
}
int get_private_member() {
return private_member;
}
};
三、继承对访问控制权限的影响
1、访问权限判定
C 的 继承方式 对 子类的 成员变量 和 成员方法 会造成影响 ,
成员的访问属性 需要看根据下面的逻辑进行判定 :
- 调用位置 : 看是在哪调用的 , 在 类内部 , 派生类 ( 子类 ) , 还是在 类外部 ;
- 子类继承方式 :
- 公有继承 : public
- 保护继承 : protected
- 私有继承 : private
- 父类中的访问级别 :
- 公有成员 : public
- 保护成员 : protected
- 私有成员 : private
2、公有继承
公有继承 :
- 使用 public 关键字继承 ;
// 子类 公有继承 父类
class Child : public Parent
- 父类成员 在 子类 中 , 访问控制权限 不变 ;
父类中的访问控制权限 如下变化 :
- 父类中的 public 成员 仍然是 public 成员 ;
- 父类中的 protected 成员 仍然是 protected 成员 ;
- 父类中的 private 成员 仍然是 private 成员 ;
3、保护继承
保护继承 :
- 使用 protected 关键字继承 ;
// 子类 保护继承 父类
class Child : protected Parent
- 父类成员 在 子类 中 , 公有成员 和 保护成员 变为 保护成员 ;
父类中的访问控制权限 如下变化 :
- 父类中的 public 成员 变成 protected 成员 ;
- 父类中的 protected 成员 仍然是 protected 成员 ;
- 父类中的 private 成员 仍然是 private 成员 ;
4、私有继承
私有继承 :
- 使用 private 关键字继承 ;
// 子类 私有继承 父类
class Child : private Parent
- 父类成员 在 子类 中 , 公有成员 和 保护成员 变为 私有成员 ;
父类中的访问控制权限 如下变化 :
- 父类中的 public 成员 变成 private 成员 ;
- 父类中的 protected 成员 变成 private 成员 ;
- 父类中的 private 成员 仍然是 private 成员 ;