【C++】继承 ④ ( 继承对访问控制权限的影响 | 访问权限判定 | 继承不包括构造与析构函数 | 继承改变成员访问权限 )

2023-10-15 16:01:05 浏览数 (1)

一、继承相关概念

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 关键字继承 ;
代码语言:javascript复制
// 子类 公有继承 父类
class Child : public Parent
  • 父类成员 在 子类 中 , 访问控制权限 不变 ;

父类中的访问控制权限 如下变化 :

  • 父类中的 public 成员 仍然是 public 成员 ;
  • 父类中的 protected 成员 仍然是 protected 成员 ;
  • 父类中的 private 成员 仍然是 private 成员 ;

3、保护继承

保护继承 :

  • 使用 protected 关键字继承 ;
代码语言:javascript复制
// 子类 保护继承 父类
class Child : protected Parent
  • 父类成员 在 子类 中 , 公有成员 和 保护成员 变为 保护成员 ;

父类中的访问控制权限 如下变化 :

  • 父类中的 public 成员 变成 protected 成员 ;
  • 父类中的 protected 成员 仍然是 protected 成员 ;
  • 父类中的 private 成员 仍然是 private 成员 ;

4、私有继承

私有继承 :

  • 使用 private 关键字继承 ;
代码语言:javascript复制
// 子类 私有继承 父类
class Child : private Parent
  • 父类成员 在 子类 中 , 公有成员 和 保护成员 变为 私有成员 ;

父类中的访问控制权限 如下变化 :

  • 父类中的 public 成员 变成 private 成员 ;
  • 父类中的 protected 成员 变成 private 成员 ;
  • 父类中的 private 成员 仍然是 private 成员 ;

0 人点赞