C++访问控制——三种继承方式

本文深入探讨了C++中公有继承、私有继承和保护继承的区别,重点阐述了保护成员在不同访问场景下的行为特性,为开发者提供了清晰的技术指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章系转载,慎重使用,尊重原创
转载地址:http://blog.youkuaiyun.com/shangyaowei/article/details/17424989

不同继承方式的影响主要体现在:

1、派生类成员对基类成员的访问控制。

2、派生类对象对基类成员的访问控制。

三种继承方式:

1、公有继承(public)

① 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问。

② 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。

③ 通过派生类的对象只能访问基类的public成员。

2、私有继承(private)

① 基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可访问。

② 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。

③ 通过派生类的对象不能访问基类中的任何成员。

3、保护继承(protected)

① 基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问。

② 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。

③ 通过派生类的对象不能访问基类中的任何成员。

protected成员的特点与作用:

对建立其所在类对象的模块来说(水平访问时),它与private成员性质相同。对于其派上类来说(垂直访问时),它与public成员的性质相同。既实现了数据隐藏,又方便继承,实现了代码重用。

### C++三种继承修饰符的区别和使用场景 在 C++ 编程语言中,类可以通过 `public`、`protected` 和 `private` 这三种方式来实现继承。每种继承方式都会影响基类成员在派生类中的访问权限以及派生类对象对外部的可见性。 #### 1. **Public 继承** 当一个类通过 `public` 方式继承另一个类时,基类的公有成员(`public`)会保持其原有的访问级别不变,在派生类中仍然是公有的;而基类的保护成员(`protected`)则会在派生类中继续保持为保护级别的状态[^2]。需要注意的是,基类的私有成员(`private`)不会被直接继承到派生类中[^3]。 ```cpp class Base { public: void publicFunc() { } protected: void protectedFunc() { } private: void privateFunc() { } // 不会被继承 }; class Derived : public Base { public: void callBaseFunctions() { publicFunc(); // 可以调用 protectedFunc(); // 可以调用 // privateFunc(); // 错误:无法访问 } }; ``` 这种继承方式通常用于表示“is-a”关系,即派生类是一种类型的基类实例[^1]。 --- #### 2. **Protected 继承** 如果一个类通过 `protected` 方式继承另一个类,则基类的公有成员和保护成员在派生类中都将变为保护成员。这意味着它们仅能被派生类及其友元类访问,而在派生类之外不可见。 ```cpp class DerivedProtected : protected Base { public: void callBaseFunctions() { publicFunc(); // 转化为 protected 成员 protectedFunc(); // 转化为 protected 成员 // privateFunc(); // 私有成员仍然不可访问 } friend class FriendClass; // 友元类可以访问 protected 成员 }; // 外部尝试访问失败 DerivedProtected dp; dp.publicFunc(); // 错误:publicFunc 已成为 protected 成员 ``` 这种方式适用于某些特定的设计模式,比如希望隐藏基类接口的具体细节,同时允许派生类内部继续使用这些功能[^1]。 --- #### 3. **Private 继承** 对于 `private` 继承而言,基类的所有非私有成员(无论是 `public` 或者 `protected`)都将在派生类中转变为私有成员。因此,即使是在派生类本身也无法再将其公开给外界使用[^2]。 ```cpp class DerivedPrivate : private Base { public: void callBaseFunctions() { publicFunc(); // 转化为 private 成员 protectedFunc(); // 转化为 private 成员 // privateFunc(); // 基类私有成员依然不可访问 } }; // 尝试外部访问失败 DerivedPrivate dprv; dprv.publicFunc(); // 错误:publicFunc 是 private 成员 ``` 此形式常用来表达一种“implemented-in-terms-of”的概念——也就是说,派生类实现了某种基于基类的功能,但它并不想让使用者知道这一点。 --- ### 使用场景分析 - 如果需要完全暴露基类的行为并遵循面向对象设计原则中的“is-a”关系,应选择 `public` 继承。 - 当希望限制部分基类行为只限于派生类内部或者进一步扩展层次结构内的子代共享时,可考虑采用 `protected` 继承。 - 对于那些仅仅利用基类作为工具而不打算透露其实现机制的情况,则适合运用 `private` 继承策略。 以上便是关于 C++ 中三类不同继承特性的介绍及各自适用场合概述[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值