首页
学习
活动
专区
工具
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析构函数 继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员

7610

C++继承

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

93030

C++继承继承语法与菱形继承

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

68710

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

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

23420

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、子类构造函数参数列表 如果 父类 构造函数 有 参数 , 则 需要再 子类 初始化列表 显示调用 该有参构造函数

18740

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

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

91600

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

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

58630

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也包含了Aa int f3(B b) { return b.b; }; //错误,C不是...B友元,不能访问其私有成员 };

39030

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

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

56320

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

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

1.3K10

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

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

37020

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

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

49820

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

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

30110

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

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

45420

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

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

47020

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,所以不能在外部直接使用 ?

51510

C++继承构造和析构学习总结

我们前面学习过类构造函数,以及析构函数,那么自然而然,在继承关系,必然是存在着析构和构造着。 一、子类对象构造 1、问题引出 如何初始化父类成员? 父类构造函数和子类构造函数有什么关系?...2、子类构造函数怎样初始化父类成员: 子类也是可以定义构造函数: --必须对继承而来成员进行初始化,那么怎样初始化呢?.../a.out Parent() Child() Parent(string s) : cc Child(string s) : cc 注解:通过上面的代码输出结果,我们可以发现,子类定义对象如果没有没有传参...,先定义了一个Child对象,然后最先访问Object带参构造函数,然后再是Parent带参构造函数(说白了就是父类先触发),然后在子类Child又包含了组合关系(也就是客人),然后Object类带参构造函数...先执行父类构造函数然后执行成员构造函数 父类构造函数显示调用需要在初始化列表中进行 子类对象在销毁时需要调用父类析构函数进行清理 析构顺序与构造顺序对称相反 好了,今天分享就到这里,如果文章中有错误或者不理解地方

33720

智能家居隐私问题再遭热议:涉案设备数据究竟不受保护

不过此次案件亚马逊也是在用户同意前提下,提供了Echo设备录音。...早在两年前,美国阿肯色州发生了一起谋杀案,与以往谋杀案最大不同之处在于,该案一项重要证据很可能来自于亚马逊Echo智能音箱录音资料。...之所以相关录音文件提交滞后了近2年时间,是因为亚马逊方面因为是否应该保护用户隐私问题,而迟疑了很久。 可以说,这一起普通谋杀案因为智能家居设备参与而变得非比寻常。...虽然在此案,Echo智能音响用户同意了亚马逊提供录音文件,但是依然引发了类似智能家居设备侵犯个人隐私争论。 ? 就在几天前,维基解密刚刚曝光了CIA黑客项目。...而在这之前,更是有苹果与FBI之间“解锁iPhone”事件。 但是,镁客君认为,作为智能设备公司应该尽到保护用户隐私义务,不过如果在用户主观认同前提下,提供相关数据也并非不合理。

53470
领券