C++保护继承,私有继承

保护继承

#include <iostream>

using namespace std;
//公有继承,父类的public继承在public下,父类的protected集成在protected下,private继承在看不到的地方,无法直接访问
//保护继承,将父类的public和protected都继承在自己的protected下,private继承在看不到的地方,无法直接访问
//私有继承,将父类的public和protected都继承在自己的private下,private继承在看不到的地方,无法直接访问

class person
{
public:
    person()
    {
        name = "zs";
    }

    void play()
    {
        cout<<"person::play()"<<endl;
        cout<<name<<endl;
    }

protected:
    string name;

};

class soldier:protected person//将name继承在protected下
{
public:
    soldier()
    {

    }

    void work()
    {
        name = "zs is pig";
        age = 30;
        cout<<name<<endl;
        cout<<age<<endl;
        cout<<"soldier::work()"<<endl;
    }

protected:
    int age;
};

class infantry:public soldier//公有继承将name集成在protected下,通过attack能访问name
{
public:
    void attack()
    {
        name = "yeah";
        cout<<name<<endl;
        cout<<"infantry::attack()"<<endl;
    }
};

int main()
{
    infantry os;
    os.attack();
}

不管哪种继承方式,父类的私有成员都不可以访问,只有间接的通过公有成员才能获取到私有成员的值

1) public继承方式
  • 基类中所有public成员在派生类中为public属性;
  • 基类中所有protected成员在派生类中为protected属性;
  • 基类中所有private成员在派生类中不可访问。

2) protected继承方式
  • 基类中的所有public成员在派生类中为protected属性;
  • 基类中的所有protected成员在派生类中为protected属性;
  • 基类中的所有private成员在派生类中仍然不可访问。

3) private继承方式
  • 基类中的所有public成员在派生类中均为private属性;
  • 基类中的所有protected成员在派生类中均为private属性;
  • 基类中的所有private成员在派生类中均不可访问。


整理自点击打开链接

<think> 首先,用户的问题是关于C++保护继承私有继承的区别。我需要基于提供的引用内容来回答这个问题。 引用[1]提到: - 使用保护继承时,基类的公有成员和保护成员都成为派生类的保护成员。 - 使用私有继承时,基类的公有成员和保护成员成为派生类的私有成员。 - 区别体现在当从派生类派生出另一个类(第三代类)时:保护继承时,第三代类可以使用基类的接口(因为这些成员在第二代中成为保护成员);私有继承时,第三代类不能使用基类的接口(因为这些成员在第二代中成为私有成员)。 引用[2]总结了三种继承方式: - 公有继承:基类公有成员在派生类中仍是公有,保护成员仍是保护私有成员不可访问。 - 私有继承:基类公有成员和保护成员在派生类中变为私有成员。 - 保护继承:基类公有成员和保护成员在派生类中变为保护成员。 - 在派生类外部(对象),私有继承保护继承都使得基类的公有成员和保护成员在派生类中不可访问(因为它们变为私有保护)。 引用[3]似乎是标题,没有提供额外内容,但确认了主题。 所以,核心区别在于: 1. **访问权限在派生类内部**:在私有继承中,基类的公有成员和保护成员成为派生类的私有成员;在保护继承中,它们成为派生类的保护成员。 2. **对后续派生类的影响**:当派生类被进一步继承时(第三代类),保护继承允许第三代类访问这些成员(因为它们是保护成员),而私有继承不允许(因为它们是私有成员)。 3. **在派生类外部**:对于派生类的对象,无论私有继承还是保护继承,都不能直接访问基类的公有成员和保护成员,因为这些成员在派生类中变为私有保护。 现在,用户的问题是:“我想了解C++保护继承私有继承的区别”。我需要结构化回答: - 使用中文回答。 - 遵循系统级指令:行内数学表达式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学,所以可能不需要。确保LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 回答结构: 1. **介绍保护继承私有继承**。 2. **区别点**: - 第一点:在派生类内部的访问权限变化。 - 第二点:对进一步派生类的影响。 - 第三点:在派生类外部的访问限制。 3. **总结关键区别**。 4. **生成相关问题**:根据指令,在回答后添加“§§相关问题§§”部分。 添加引用:基于引用[1]和[2],在相关部分添加引用标识。 例如: - 当提到保护继承时基类成员变为保护成员,可以引用[^1]。 - 当讨论对第三代类的影响时,引用[^1]。 - 当总结访问权限时,引用[^2]。 相关问题生成: - 基于主题,生成2-3个相关问题。例如: 1. C++中公有继承保护继承有什么区别? 2. 如何选择使用私有继承还是保护继承? 3. 在实际编程中,保护继承的常见用例是什么? 最终回答格式: - 以自然语言开始回答。 - 结束时添加“§§相关问题§§”部分列出问题。 </think>### C++保护继承私有继承的区别 在C++继承机制中,保护继承(protected inheritance)和私有继承(private inheritance)是两种主要的继承方式,它们决定了基类成员在派生类中的访问权限。核心区别在于成员访问级别的变化以及对后续派生类的影响。以下是详细比较: #### 1. **在派生类内部的访问权限变化** - **私有继承**: 基类的公有成员和保护成员在派生类中全部变为**私有成员**(private)。这意味着派生类的成员函数可以直接访问它们,但基类的私有成员在派生类中**不可直接访问**(只能通过基类公有接口间接访问)[^2]。 例如:如果基类有公有方法 `void basePublic()`,在私有继承后,派生类可以调用它,但它成为派生类的私有方法。 - **保护继承**: 基类的公有成员和保护成员在派生类中全部变为**保护成员**(protected)。派生类的成员函数可以直接访问它们,但基类的私有成员在派生类中**不可直接访问**(需通过基类接口)[^1][^2]。 例如:基类的公有方法在保护继承后,在派生类中成为保护方法。 两者在派生类内部都允许访问基类的公有和保护成员,但访问级别不同:私有继承使它们变为私有保护继承使它们变为保护。 #### 2. **对后续派生类(第三代类)的影响** 这是两者的核心区别,当派生类被进一步继承时: - **私有继承**: 基类的成员在第二代派生类中变为私有,因此第三代派生类**无法访问**这些成员(因为私有成员不能在派生类中继承)[^1]。 例如:如果从私有继承的派生类派生出新类,新类无法调用基类的方法(它们已被“隐藏”为私有)。 - **保护继承**: 基类的成员在第二代派生类中变为保护成员,因此第三代派生类**可以访问**这些成员(因为保护成员可在派生类中继承)[^1]。 例如:从保护继承的派生类派生出新类,新类可以调用基类的方法(它们仍是保护成员,可在继承链中传递)。 #### 3. **在派生类外部的访问限制** - **私有继承**: 派生类的对象(在类外部)**无法直接访问**基类的公有成员和保护成员(因为它们已变为私有成员)[^2]。基类的私有成员始终不可在外部访问。 - **保护继承**: 派生类的对象**同样无法直接访问**基类的公有成员和保护成员(因为它们已变为保护成员)[^2]。保护成员在类外部不可访问。 #### 总结关键区别表 | 特性 | 私有继承 | 保护继承 | |--------------------------|-----------------------------------|-----------------------------------| | **基类成员在派生类中的状态** | 公有和保护成员 → 私有成员 | 公有和保护成员 → 保护成员 | | **第三代派生类可访问性** | ❌ 不可访问(私有成员不继承) | ✅ 可访问(保护成员可继承) | | **派生类外部访问性** | ❌ 不可访问(私有成员外部不可见) | ❌ 不可访问(保护成员外部不可见) | | **适用场景** | 实现“has-a”关系(组合替代) | 扩展接口到派生类层次 | #### 示例代码说明 假设基类 `Base`: ```cpp class Base { public: void publicMethod() {} protected: void protectedMethod() {} private: void privateMethod() {} }; ``` - **私有继承**: ```cpp class DerivedPrivate : private Base { public: void access() { publicMethod(); // 可访问(变为私有) protectedMethod(); // 可访问(变为私有) // privateMethod(); // 错误:基类私有成员不可访问 } }; class ThirdPrivate : public DerivedPrivate { void tryAccess() { // publicMethod(); // 错误:在DerivedPrivate中已私有,不可继承 } }; ``` - **保护继承**: ```cpp class DerivedProtected : protected Base { public: void access() { publicMethod(); // 可访问(变为保护) protectedMethod(); // 可访问(变为保护) } }; class ThirdProtected : public DerivedProtected { void tryAccess() { publicMethod(); // 可访问(继承保护成员) } }; ``` 在实际编程中,优先使用公有继承(public inheritance),除非需要隐藏基类接口。私有继承常用于实现组合(composition),而保护继承适用于设计可扩展的类层次结构[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值