首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有我们需要*C++中的受保护继承的例子?

受保护继承是C++中的一种继承方式,它允许子类访问基类中的受保护成员,但不能访问基类中的私有成员。在C++中,受保护继承使用关键字protected表示。

以下是一个使用受保护继承的例子:

代码语言:cpp
复制
#include<iostream>

class Base {
public:
    int public_member;

protected:
    int protected_member;

private:
    int private_member;
};

class Derived : protected Base {
public:
    void show() {
        std::cout << "Public member: "<< public_member<< std::endl;
        std::cout << "Protected member: "<< protected_member<< std::endl;
        // std::cout << "Private member: "<< private_member<< std::endl; // This line will cause a compilation error
    }
};

int main() {
    Derived d;
    d.public_member = 1;
    d.protected_member = 2;
    // d.private_member = 3; // This line will cause a compilation error
    d.show();
    return 0;
}

在这个例子中,Derived类通过受保护继承Base类,因此可以访问Base类中的公共成员和受保护成员,但不能访问私有成员。在Derived类的show方法中,可以访问public_memberprotected_member成员,但不能访问private_member成员。

总之,受保护继承是一种控制类成员访问权限的方式,可以在不暴露类的实现细节的同时,允许子类访问基类中的某些成员。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中的继承

基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 注意在实际中在继承体系里面最好不要定义同名的成员。...6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?...派生类对象析构清理先调用派生类析构再调基类的析构。 因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲解)。...,构造一个新的B对象,首先调用了A的构造函数,然后调用B的构造函数,析构函数则是先调用B的析构函数,然后再调用A的析构函数 继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员

9510

C++中的继承

以前我们接触的复用都是函数复用,继承是类设计层次的复用。...基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 注意在实际中在继承体系里面最好不要定义同名的成员。...派生类对象析构清理先调用派生类析构再调基类的析构。 因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲 解)。...多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。

6810
  • C++中的继承

    ⭐前言:相信许多人人都写过学生管理系统、电商管理系统等等的项目,如果我们去用C++去写,并且用类来封装老师、学生、宿管等等角色的属性,我们就会发现,有不少的属性是相同的,从而会造成代码冗余。...private是谁都不能动,protected是给派生类继承的而保护起来的,不能给外人动!这样侧面说了, 可以看出保护成员限定符protected是因继承才出现的。...多继承本身没啥问题,但是多继承带来了一种特殊的继承方式:菱形继承。菱形继承会导致代码冗余和二义性的问题,这是C++初次设计多继承时留下了的问题。...如果是公有继承,那么保护和公有都被继承下来,组合的话只能使用公有的。 因为组合的耦合度低,而继承的耦合度高,因此优先使用组合而不是继承。...如果我们使用继承,在后续根据需求需要改Person类中的成员函数或变量,删掉若干个,新增若干个,无论是保护的还是公有的,如果我们使用公有继承,那么,就很容易对子类造成影响,因为100个父类的成员都跟子类有关系嘛

    1K30

    【c++】C++中的继承&&菱形继承详解

    这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问...可以看出保护成员限定符是因继承才出现的 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。...(在子类成员函数中,可以使用 基类::基类成员 显示访问) 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏 注意在实际中在继承体系里面最好不要定义同名的成员 Student的_num和Person...6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?...如何解决数据冗余和二义性的 菱形继承问题和虚继承是如何解决二义性与数据冗余的_数据的二义性-CSDN博客 C++继承的问题 : 菱形继承 (虚拟继承)_c++菱形继承问题-CSDN博客 3.

    15910

    C++继承中的多继承语法与菱形继承

    多继承语法 C++允许一个类继承多个类 语法: class 子类 :继承方式 父类1 , 继承方式 父类2......多继承可能会引发父类中有同名成员出现,需要加作用域区分 C++实际开发中不建议用多继承 示例: class Base1 { public: Base1() { m_A = 100; } public...羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。...草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。...使用了虚继承后对比未使用虚继承解决菱形继承 总结: 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义 利用虚继承可以解决菱形继承问题

    73010

    【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )

    一、继承中的对象模型分析 1、继承代码示例 下面有 3 个类 , 分别是 A 类 , B 类 , C 类 ; A 类是 基类 ; B 类 公有继承 A 类 , 并定义了新的 成员变量 y ; C 类...成员 , 在内存中是 2 个 int 类型的空间 ; C 类对象 objC 中 , 除了继承自 B 类的 int x 和 int y 成员 , 还有一个自己的 int z 成员 , 在内存中是 3 个...---- 1、子类构造函数与析构函数调用顺序 继承中的构造函数和析构函数 : 子类构造 : 子类对象 进行 构造 时 , 需要调用 父类 的 构造函数 对 继承自父类的 成员变量 进行 初始化 操作...进行 析构 时 , 需要调用 父类 的 析构函数 对 继承自父类的 成员变量 进行 析构 操作 ; 析构函数调 用顺序如下 : 析构时 , 先 调用 子类 的 析构函数 , 析构 子类 自己的成员...; 然后 , 再调用 父类 的 析构函数 , 析构 继承自父类的成员 ; 2、子类构造函数参数列表 如果 父类 的 构造函数 有 参数 , 则 需要再 子类 的 初始化列表中 显示调用 该有参构造函数

    24540

    【C++】继承 ⑨ ( 继承中成员变量同名的处理方案 )

    一、继承中成员变量同名的处理方案 1、继承中成员变量同名的场景说明 子类 继承 父类 的 成员 , 如果 子类 中定义了 与 父类成员变量 同名的 变量 , 子类 仍然 可以 继承 父类的 同名 成员变量...: 继承自父类的成员变量 , 使用 父类名称::成员变量名称 替代 成员变量名称 , 如 : Parent 是父类名称 variable 是父类中的变量名称 如果子类中也定义了 variable...variable ; // 不使用域作用符 variable // 使用子类域作用符 Child::variable 二、代码示例 - 继承中成员变量同名的处理方案 ---- 代码分析 : 在下面的代码中..., 也可以不使用域作用符 , 直接访问 b ; 子类 Child 中 , 定义了 print 成员函数 , 在该函数中 , 通过 Parent::b 访问 继承自父类的 b 成员 , 通过 Child:..., 访问 继承自父类的 成员变量 ; Child child; // 访问 子类对象 child 中 继承自 父类的 b 成员 child.Parent::b = 10; 完整代码示例 : #

    42720

    从零开始学C++之继承(一):公有私有保护继承、overloadoverwriteoverride之间的区别

    (四)、接口继承与实现继承 我们将类的公有成员函数称为接口。 公有继承,基类的公有成员函数在派生类中仍然是公有的,换句话说是基类的接口成为了派生类的接口,因而将它称为接口继承。...二、用C++设计一个不能继承的类 在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字,要实现这个要求还是需要花费一些精力。...首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。...比如,我们只能得到位于堆上的实例,而得不到位于栈上实例。能不能实现一个和一般类除了不能被继承之外其他用法都一样的类呢?办法总是有的,不过需要一些技巧。...基于上面的分析,试图从FinalClass2继承的类,一旦实例化,都会导致编译错误,因此是FinalClass2不能被继承。这就满足了我们设计要求。 为什么需要虚继承?

    1.1K00

    CA1047:不要在密封类型中声明受保护的成员

    值 规则 ID CA1047 类别 设计 修复是中断修复还是非中断修复 非中断 原因 公共类型是 sealed(在 Visual basic 中为 NotInheritable),并声明了一个受保护的成员或受保护的嵌套类型...此规则不报告 Finalize 方法的冲突,这些方法必须遵循此模式。 规则说明 类型声明受保护的成员,使继承类型可以访问或重写该成员。...按照定义,不能从密封类型继承,这表示不能调用密封类型上的受保护方法。 对于此错误,C# 编译器会发出警告。 如何解决冲突 若要解决此规则的冲突,请将成员的访问级别更改为专用,或使该类型可继承。...包含特定的 API 图面 你可以仅为此规则、为所有规则或为此类别中的所有规则配置此选项(设计)。 有关详细信息,请参阅代码质量规则配置选项。...包含特定的 API 图面 你可以根据代码库的可访问性,配置要针对其运行此规则的部分。

    63330

    C++:49---继承中的友元

    一、友元在继承中的关系 我们在友元的文章中介绍过,友元关系不能继承。 (1)友元关系不存在传递性,即每个类负责控制自己的友元类或者友元函数; (2)友元关系是单向的,不具有交换性。...若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3)友元关系不能被继承。...因此: 基类的友元不能访问派生类的新成员,但是仍可以访问派生类从基类继承而来的成员/方法 派生类的友元也不能随意访问基类的成员 二、演示案例 class A { private: int a; friend...,可以访问其任何成员 int f2(B b) { return b.a; }; //正确,因为B继承了A,所以B中也包含了A的a int f3(B b) { return b.b; }; //错误,C不是...B的友元,不能访问其私有成员 };

    45630

    C++继承中的对象模型与继承中构造和析构顺序

    继承中的对象模型 问题:从父类继承过来的成员,哪些属于子类对象中?...打开工具窗口后,定位到当前CPP文件的盘符 然后输入: cl /d1 reportSingleClassLayout查看的类名 所属文件名 效果如下图: 结论: 父类中私有成员也是被子类继承下去了...,只是由编译器给隐藏后访问不到 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构造和析构顺序是谁先谁后?...<< endl; } }; void test01() { //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 Son s; } int main() { test01...(); system("pause"); return 0; } 速记:构造时现有父亲后又儿子,析构顺序相反(白发送黑发) 总结:继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

    58020

    开发中我们需要遵循的几个设计原则!

    给你的程序增加艺术气息,将程序艺术化是我们的目标! 3、例子 设计模式中模板方法模式和观察者模式都是开闭原则的极好体现。...3、例子1 理解这个依赖倒置,首先我们需要明白依赖在面向对象设计的概念: 依赖关系(Dependency):是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系...2、原则分析 (1)在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。 继承复用:实现简单,易于扩展。...,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。...5、例子 外观模式Facade(结构型) 迪米特法则与设计模式Facade模式、Mediator模式 系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,因为在你的系统中,扩展的时候,你可能需要修改这些类

    1.5K10

    开发中我们需要遵循的几个设计原则!

    给你的程序增加艺术气息,将程序艺术化是我们的目标! 3、例子 设计模式中模板方法模式和观察者模式都是开闭原则的极好体现。...3、例子1 理解这个依赖倒置,首先我们需要明白依赖在面向对象设计的概念: 依赖关系(Dependency):是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系...2、原则分析 (1)在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。 继承复用:实现简单,易于扩展。...,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。...5、例子 外观模式Facade(结构型) 迪米特法则与设计模式Facade模式、Mediator模式 系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,因为在你的系统中,扩展的时候,你可能需要修改这些类

    38720

    探索CC++的奥秘之C++中的继承

    基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。 3....需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 4. 注意在实际中在继承体系里面最好不要定义同名的成员。...扩展知识:在我们的设计当中,不要去设计一些父类的私有成员,也不要用保护继承和私有继承,如果用保护继承和私有继承这些会出现很多的坑,包括赋值兼容规则,如果用的保护继承,这个规则就不支持了。...因此不需要我们调, 析构函数是一个特殊,它会自动调。为什么会自动调用,因为它要保证析构的顺序。...因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲 解)。

    12310

    关于C++中菱形继承的解释和处理

    派生类继承父类,同时也会继承父类中的所有成员副本,但如果在继承时一个基类同时被两个子类继承,然后一个新类又分别由上面的两个子类派生出来。...这样从某种程度来说就形成了C++中的菱形继承,也可以叫做钻石继承,具体的继承形式如下图所示: 在上面的类图说,Left和Right分别派生子Top,但是Bottom又分别继承了Left和Right。...继承关系也可以画成下面的方式,这样就可以更好的理解设计中存在的问题。...对象也不能直接调用Top中定义的方法,如果要使用需要提供一个Top子对象,但是从类图可知存在两个Top对象。...虚基类给在确实需要使用菱形继承的地方提供了一个很好的解决方法,通过子类共享一个基类对象避免基类对象的二义性问题。

    54220

    【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

    一、继承机制中派生类中的 static 关键字 1、子类继承父类静态成员 子类继承父类静态成员 : 父类 ( 基类 ) 中 使用 static 关键字 定义的 静态成员变量 , 可以被所有的 子类 (...派生类 ) 共享 ; 2、父类静态成员访问控制权限的改变 继承自 父类的 静态成员变量 , 仍然遵循 继承中 子类的 访问控制特性 , public 公有继承 : 父类成员 在 子类 中 , 访问控制权限...成员 ; 父类中的 private 成员 仍然是 private 成员 ; protected 保护继承 : 父类成员 在 子类 中 , 访问控制权限 变为 protected , 基类的 公有成员...和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 protected 成员 ; 父类中的 protected 成员 仍然是 protected...; 或 对象名.静态成员名 child.c = 30; 的方式 , 访问 继承自 父类的 静态成员 ; 4、静态成员使用要点 参考 【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 |

    54910

    我们在开发中需要遵循的几个设计原则!

    给你的程序增加艺术气息,将程序艺术化是我们的目标! 3、例子 设计模式中模板方法模式和观察者模式都是开闭原则的极好体现。...3、例子1 理解这个依赖倒置,首先我们需要明白依赖在面向对象设计的概念: 依赖关系(Dependency):是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系...2、原则分析 (1)在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。 继承复用:实现简单,易于扩展。...,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。...5、例子 外观模式Facade(结构型) 迪米特法则与设计模式Facade模式、Mediator模式 系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,因为在你的系统中,扩展的时候,你可能需要修改这些类

    59720

    开发中我们需要遵循的几个设计原则!(转)

    给你的程序增加艺术气息,将程序艺术化是我们的目标! 3、例子 设计模式中模板方法模式和观察者模式都是开闭原则的极好体现。...3、例子1 理解这个依赖倒置,首先我们需要明白依赖在面向对象设计的概念: 依赖关系(Dependency):是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系...2、原则分析 (1)在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。 继承复用:实现简单,易于扩展。...,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。...5、例子 外观模式Facade(结构型) 迪米特法则与设计模式Facade模式、Mediator模式 系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度,因为在你的系统中,扩展的时候,你可能需要修改这些类

    47520

    C++:40---继承中类成员的变化关系

    一、派生类继承基类成员的规则 ①派生类继承了基类的所有数据成员与函数(不论公有成员、保护成员、私有成员) ②派生类虽然继承了基类的所有成员,但是能不能访问基类的成员还与父类成员的属性(public、protected...、private)以及继承方式有关 ③类静态成员:如果基类定义了一个静态成员,那么该静态成员在整个继承体系中都存在。...该静态成员只能定义一次,派生类不能再次定义 一个类改变了静态成员的值,整个继承体系中的值都将改变 #include using namespace::std; class A {...class B :public A { public: int b_data; B(int data) :A(data), b_data(data) {} void showB(){} }; 可以看到B公有继承于...A,B可以在类内访问父类A的所有public、protected成员,但不能访问private成员 由于父类的protected成员在子类中也是protected的,所以不能在外部直接使用 ?

    55310
    领券