类的公有继承和私有继承的区别?

本文详细解释了面向对象编程中继承的两种类型——共有继承和私有继承的特点及区别。共有继承保留了基类成员在派生类中的原始访问权限,而私有继承则将基类的公共和保护成员转变为私有的。

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

共有继承:

1 共有继承不改变基类成员在派生类中的访问权限。在共有继承下,基类的public成员,protect成员,private成员在派生类中保持它们在基类中相同的访问权限。

2 在派生类中定义的成员函数不能直接访问基类的私有成员,只能通过public或protect成员函数访问。

私有继承:

1 基类的private和protect都在派生类中变成了private成员,不能被派生类的外部函数访问。

2 派生类的成员函数不能访问基类的private成员,但可以访问基类的public和protect成员,并通过它们访问基类private成员。

### C++ 公有继承私有继承区别及用法 #### 1. 定义上的差异 公有继承表示派生会保留基中所有公有成员的访问级别不变,同时将保护成员保持为保护级别的状态。因此,在公有继承下,基中的公有成员在派生外部仍然可以直接被访问[^3]。 相比之下,私有继承则改变了基成员的访问属性。无论基成员原本是公有的还是受保护的,在私有继承下的派生中都会变为私有成员。这使得这些成员无法再由派生的子代或其他外部实体直接访问[^4]。 #### 2. 访问控制的不同 - **公有继承**: 基中的 `public` 成员在派生中仍然是 `public` 的;基中的 `protected` 成员在派生中依然是 `protected` 的。这种继承方式强调的是“is-a”的关系,即派生是一种特定型的基实例。 ```cpp class Base { public: void pubFunc() {} protected: int protVar; }; class Derived : public Base {}; int main() { Derived d; d.pubFunc(); // 可以正常调用 return 0; } ``` - **私有继承**: 私有继承下,基的所有成员(无论是 `public` 还是 `protected`)都变成了派生中的 `private` 成员。这意味着即使它们可以被派生本身的方法所使用,也无法通过派生的对象直接访问。 ```cpp class Base { public: void pubFunc() {} protected: int protVar; }; class Derived : private Base {}; int main() { Derived d; d.pubFunc(); // 编译错误,pubFunc 已成为 private return 0; } ``` #### 3. 使用场景的选择 - 当希望表达一种显式的“is-a”语义时,通常会选择公有继承。例如,当定义一个 `Dog` 从 `Animal` 继承时,我们期望能够像对待任何动物一样处理狗的行为。 - 而对于那些更倾向于实现细节共享而非型层次结构扩展的情况,则适合采用私有继承或者组合模式替代之。比如某些情况下为了重用某个现有的功能而不是暴露其接口给外界的时候就可以考虑运用这种方式[^5]。 #### 总结表格对比 | 特性 | 公有继承 | 私有继承 | |-----------------|-----------------------------------|------------------------------------| | 子可见性 | Public -> Public, Protected->Protected | All become Private | | 对象间转换 | 支持 | 不支持 | | 主要用途 | 表达 is-a 关系 | 实现功能复用 | ```cpp // 示例代码展示两种继承方式的实际效果 class A { public: void fPublic() { std::cout << "A's public function\n"; } protected: void fProtected() { std::cout << "A's protected function\n"; } }; class B : public A {}; // 公有继承 class C : private A {}; // 私有继承 int main(){ B b; b.fPublic(); // 正常工作 C c; // 下面这一行会产生编译器错误因为fPublic现在成了C里的private成员 // c.fPublic(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值