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

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

在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):
  • 私有成员指的是类内部的变量(数据成员)或函数(成员函数/方法),这些成员只能被该类自身访问,而不能被类的外部代码(包括其他类的成员函数或全局函数)直接访问。
  • 私有成员的存在是为了实现封装,即隐藏类的内部实现细节,确保数据的安全性和完整性。
访问控制的意义:

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

目录
相关文章
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
4月前
|
JavaScript 前端开发 Java
原型对象和类之间的区别是什么
【8月更文挑战第2天】原型对象和类之间的区别是什么
83 8
|
6月前
|
C++
友元是一种允许某些外部函数或类访问另一个类的成员的机制
友元是C++中的一个强大特性,它提供了一种机制来允许特定的外部函数或类访问私有和保护成员。正确使用友元可以增强程序的功能性和灵活性,但应谨慎使用以避免破坏封装性和增加代码的复杂度。在设计类和功能时,合理利用友元,可以使得C++程序更加有效和高效。
52 2
18-类和对象-封装-成员属性私有化
18-类和对象-封装-成员属性私有化
|
Java
JAVA:私有成员变量的调用 与 构造函数私有化 、构造函数保持成员变量私有性
私有成员变量的调用 与 构造函数私有化 、构造函数保持成员变量私有性的介绍
539 0
JAVA:私有成员变量的调用 与 构造函数私有化 、构造函数保持成员变量私有性
|
数据安全/隐私保护 C++
C++类中数据成员要私有
C++类中数据成员要私有
291 0
|
Java 编译器 API
私有构造方法强制不可实例化的性质
私有构造方法强制不可实例化的性质
142 0
私有构造方法强制不可实例化的性质
C++类的公有/私有继承,基类的私有成员在派生类中访问情况
C++类的公有/私有继承,基类的私有成员在派生类中访问情况
738 0
C++访问类的私有成员变量的方法(友元函数、友元类)
C++访问类的私有成员变量的方法(友元函数、友元类)
634 0
|
C# 开发工具
[C#]如何访问及调用类中私有成员及方法
原文:[C#]如何访问及调用类中私有成员及方法 本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.
1285 0