public, private和protected继承比较

本文详细介绍了C++中三种继承方式——公有继承、私有继承和保护继承的区别,包括基类成员对其对象、派生类及派生类对象的可见性,并简述了多重继承的概念。
     以下内容整理自《程序员面试宝典》,重点讨论一下C++中三种继承方式的区别。

1, 公有继承(public

基类成员对其对象的可见性与一般类及其对象的可见性相同,public成员可见,protectedprivate成员不可见。

基类成员对派生类的可见性对派生类来说,基类的publicprotected成员可见:基类的public成员和protected成员作为派生类的成员时,它们都保持原有状态;基类的private成员依旧是private,派生类不可访问基类中的private成员。

基类成员对派生类对象的可见性 对派生类对象来说,基类的public成员是可见的,其他成员是不可见的。

所以,在公有继承时,派生类的对象可以访问基类中的public成员,派生类的成员方法可以访问基类中的public成员和protected成员。

2, 私有继承(private

基类成员对其对象的可见性与一般类及其对象的可见性相同,public成员可见,其他成员不可见。

基类成员对派生类的可见性对派生类来说,基类的public成员和protected成员是可见的:基类的public成员和protected成员都作为派生类的private成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的private成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以在私有继承时,基类的成员只能由直接派生类访问,无法再往下继承。

3.保护继承(protected

保护继承与私有继承相似,基类成员对其对象的可见性与一般类及其对象的可见性相同,public成员可见,其他成员不可见。

基类成员对派生类的可见性,对派生类来说,基类的publicprotected成员是可见的:基类的public成员和protected成员都作为派生类的protected成员,并且不能被这个派生类的子类所访问;基类的private成员是不可见的:派生类不可访问基类中的private成员。

基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再向下继承。

C++支持多重继承。多重继承是一个类从多个基类派生而来的能力。派生类实际上获取了所有基类的特性。当一个类 是两个或多个基类的派生类时,派生类的构造函数必须激活所有基类的构造函数,并把相应的参数传递给它们

继承中,`public`、`protected`、`private` 访问修饰符决定了基类成员在派生类中的可访问性可见性。具体规则如下: #### 公有继承(`public`) 当使用 `public` 继承时,基类的 `public` 成员在派生类中仍然是 `public` 的,基类的 `protected` 成员在派生类中仍然是 `protected` 的,而基类的 `private` 成员在派生类中可直接访问。例如: ```cpp class Base { public: void publicFunc() {} protected: void protectedFunc() {} private: void privateFunc() {} }; class Derived : public Base { public: void accessBaseMembers() { publicFunc(); // 可以访问,因为在 Base 中是 public protectedFunc(); // 可以访问,因为在 Base 中是 protected // privateFunc(); // 可访问,因为在 Base 中是 private } }; ``` #### 保护继承(`protected`) 使用 `protected` 继承时,基类的 `public` `protected` 成员在派生类中都变为 `protected` 的,基类的 `private` 成员在派生类中可直接访问。示例如下: ```cpp class Base { public: void publicFunc() {} protected: void protectedFunc() {} private: void privateFunc() {} }; class Derived : protected Base { public: void accessBaseMembers() { publicFunc(); // 可以访问,现在在 Derived 中变为 protected protectedFunc(); // 可以访问,在 Base 中就是 protected // privateFunc(); // 可访问,因为在 Base 中是 private } }; ``` #### 私有继承(`private`) 采用 `private` 继承,基类的 `public` `protected` 成员在派生类中都变为 `private` 的,基类的 `private` 成员在派生类中可直接访问。示例代码如下: ```cpp class Base { public: void publicFunc() {} protected: void protectedFunc() {} private: void privateFunc() {} }; class Derived : private Base { public: void accessBaseMembers() { publicFunc(); // 可以访问,现在在 Derived 中变为 private protectedFunc(); // 可以访问,现在在 Derived 中变为 private // privateFunc(); // 可访问,因为在 Base 中是 private } }; ``` 总结来说,`public` 继承保持成员的访问级别变,`protected` 继承将基类的 `public` `protected` 成员变为 `protected`,`private` 继承将基类的 `public` `protected` 成员变为 `private`。基类的 `private` 成员在任何继承方式下,派生类都能直接访问 [^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值