公有、保护、私有继承的区别

简介: 公有、保护、私有继承的区别

在C++中,继承的访问控制(public、protected、private)决定了基类成员在派生类中的可见性和可访问性,同时也影响了派生类对象和外界对这些成员的访问权限

公有继承(public inheritance)

  • 基类成员在派生类中的访问权限:基类的公有成员在派生类中依旧保持公有;基类的保护成员变为派生类的保护成员;基类的私有成员对于派生类来说是不可见的,但派生类的成员函数可以访问基类的公有和保护成员。
  • 派生类对象的访问权限:派生类对象可以直接访问继承自基类的公有成员,不能直接访问保护成员和基类的私有成员。
  • 体现的关系:通常表示“is-a”关系,意味着派生类是一种特殊的基类。

保护继承(protected inheritance)

  • 基类成员在派生类中的访问权限:无论基类成员是公有还是保护,它们在派生类中都变为保护成员,基类的私有成员对派生类同样不可见。
  • 派生类对象的访问权限:派生类对象不能直接访问继承来的任何成员,包括那些在派生类中变为保护的成员。
  • 用途:保护继承通常用于设计中希望强调派生类和基类之间的关系,并限制外部对基类成员的直接访问,同时允许派生类及其子类内部访问这些成员。

私有继承(private inheritance)

  • 基类成员在派生类中的访问权限:基类的公有和保护成员在派生类中都变为私有成员,基类的私有成员依旧不可访问。
  • 派生类对象的访问权限:派生类对象不能直接访问这些私有继承的成员。
  • 用途:私有继承更多地用于实现“has-a”或“uses-a”关系,而非“is-a”。它常用于实现委托或复合关系,即派生类不是基类的一种形态,而是“拥有”或“使用”基类的功能。

总结(选择哪种继承方式取决于设计目的)

  1. 公有继承强调类型兼容性和接口复用;
  2. 保护继承用于限制访问同时保持一定程度的内部可访问性;
  3. 私有继承则更倾向于实现特定功能的复用,而不暴露基类接口给派生类的用户。
私有成员(private):
  • 私有成员只能被其所在类的成员函数和友元函数访问。外部代码,包括派生类,都无法直接访问私有成员。
  • 私有成员提供最高级别的封装,确保类的内部实现细节对外部隐藏。
保护成员(protected):
  • 保护成员类似于私有成员,外部代码不能直接访问。但是,保护成员对派生类是可见的,也就是说,派生类的成员函数可以访问基类的保护成员。
  • 保护成员的设计目的是为了在继承体系中提供一定程度的访问权限,允许子类访问并可能重写或扩展基类的部分功能,同时保持这些成员对更广泛的外部世界不可见。
私有成员(Private Members):
  • 私有成员指的是类内部的变量(数据成员)或函数(成员函数/方法),这些成员只能被该类自身访问,而不能被类的外部代码(包括其他类的成员函数或全局函数)直接访问。
  • 私有成员的存在是为了实现封装,即隐藏类的内部实现细节,确保数据的安全性和完整性。
访问控制的意义:

有助于实现封装、继承和多态三大特性,特别是封装。通过限制对类内部数据和方法的访问,可以减少耦合,增强代码的安全性和可维护性。设计者可以决定哪些接口(即公有成员)是对外公开的,而将实现细节(私有和保护成员)隐藏起来,从而确保了代码的模块化和易于管理。这对于复杂的软件系统尤为重要,因为它允许各部分独立开发、测试和修改,而不影响到系统的其他部分。

目录
相关文章
|
3月前
|
C++
友元是一种允许某些外部函数或类访问另一个类的成员的机制
友元是C++中的一个强大特性,它提供了一种机制来允许特定的外部函数或类访问私有和保护成员。正确使用友元可以增强程序的功能性和灵活性,但应谨慎使用以避免破坏封装性和增加代码的复杂度。在设计类和功能时,合理利用友元,可以使得C++程序更加有效和高效。
31 2
类的内部成员之五:内部类
类的内部成员之五:内部类
30 1
|
12月前
类和对象-封装-成员属性私有化
类和对象-封装-成员属性私有化
41 0
|
Java 程序员 C#
C++类成员的访问权限以及类的封装
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。 Java、C# 程序员注意,C++ 中的 public、private、protected 只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。 在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。 在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 p
80 0
|
Java 程序员
2.2 为什么使用内部类:访问外部类的私有成员
2.2 为什么使用内部类:访问外部类的私有成员
188 0
18-类和对象-封装-成员属性私有化
18-类和对象-封装-成员属性私有化
|
Java Scala vr&ar
内部类访问外部类属性案例|学习笔记
快速学习内部类访问外部类属性案例。
|
数据安全/隐私保护 C++
C++类中数据成员要私有
C++类中数据成员要私有
271 0
|
Java 编译器 API
私有构造方法强制不可实例化的性质
私有构造方法强制不可实例化的性质
130 0
私有构造方法强制不可实例化的性质
C++类的公有/私有继承,基类的私有成员在派生类中访问情况
C++类的公有/私有继承,基类的私有成员在派生类中访问情况
713 0