C++之类的三种继承修饰符(public、private、protected)总结

1、前言

       前文博客介绍了修饰符public、private、protected在类中成员变量和函数访问权限限制的总结,主要如下:

  1. public(公有):

    • 公有成员在类的内部和外部都可以被访问。
  2. private(私有):

    • 私有成员只能在类的内部被访问,不能在类的外部直接访问。
  3. protected(保护):

    • 保护成员在类的内部可以被访问,在类的外部不能被直接访问。

        具体可参见博客C++之类(class)的三种访问修饰符(public、private、protected)----成员变量与函数权限-CSDN博客

      这篇博客介绍修饰符public、private、protected在类继承上权限限制,总结如下:

  1. 公有继承(public):

    • 公有继承的规则是“is-a”关系,即子类是基类的一种。
    • 基类的公有成员在子类中保持公有属性
    • 基类的保护成员在子类中保持保护属性
    • 基类的私有成员不可被继承,因此在子类中不可见
    • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。

    • 通过派生类的对象访问从基类继承的成员,只能访问public成员。

  2. 保护继承(protected):

    • 保护继承通常用于实现“is-implemented-in terms of”关系。
    • 基类的公有成员和保护成员在子类中都变为保护属性
    • 基类的私有成员不可被继承,因此在子类中不可见
    • 生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
    • 通过派生类的对象不能直接访问从基类继承的任何成员
  3. 私有继承(private):

    • 私有继承用于实现“uses-a”关系,即子类使用基类来实现某些功能,但不是基类的一种。
    • 基类的公有成员和保护成员在子类中都变为私有属性
    • 基类的私有成员不可被继承,因此在子类中不可见。
    • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
    • 通过派生类的对象不能直接访问从基类继承的任何成员

2、类中属性访问权限示例介绍

2.1、public类继承

    基类Shape被Rectangle以public形式进行继承,

测试源代码如下:

#include<iostream>
using namespace std;
//基类
class Shape
{
public:double width;//宽度
protected:double length;//长度public:void setWidth(double width);void setLength(double length);double getLength();
};
void Shape::setWidth(double width)
{this->width = width;
}
void Shape::setLength(double length)
{this->length = length;
}
double Shape::getLength()
{return length;
}//派生类
class Rectangle :public Shape
{
public:double Area();
};
double Rectangle::Area()
{return width*length;//直接访问基类public属性
}int main()
{Rectangle RecObj;RecObj.setLength(4);RecObj.setWidth(2);cout << "length of rectangle is " << RecObj.length << endl;cout << "length of rectangle is " << RecObj.getLength() << endl;cout << "width of rectangle is " << RecObj.width << endl;cout << "area of rectangle is " << RecObj.Area() << endl;
}

2.2 protected类继承

  基类Shape被Rectangle以protected形式进行继承

测试代码:

#include<iostream>
using namespace std;
//基类
class Shape
{
public:double width;//宽度
protected:double length;//长度public:void setWidth(double width);void setLength(double length);double getLength();
};
void Shape::setWidth(double width)
{this->width = width;
}
void Shape::setLength(double length)
{this->length = length;
}
double Shape::getLength()
{return length;
}//派生类
class Rectangle :protected Shape
{
public:double Area();
};
double Rectangle::Area()
{return width*length;//直接访问基类public属性
}int main()
{Rectangle RecObj;RecObj.setLength(4);RecObj.setWidth(2);cout << "length of rectangle is " << RecObj.length << endl;cout << "length of rectangle is " << RecObj.getLength() << endl;cout << "width of rectangle is " << RecObj.width << endl;cout << "area of rectangle is " << RecObj.Area() << endl;
}

2.3、private类继承

  基类Shape被Rectangle以protected形式进行继承

测试代码:

#include<iostream>
using namespace std;
//基类
class Shape
{
public:double width;//宽度
protected:double length;//长度public:void setWidth(double width);void setLength(double length);double getLength();
};
void Shape::setWidth(double width)
{this->width = width;
}
void Shape::setLength(double length)
{this->length = length;
}
double Shape::getLength()
{return length;
}//派生类
class Rectangle :private Shape
{
public:double Area();
};
double Rectangle::Area()
{return width*length;//直接访问基类public属性
}int main()
{Rectangle RecObj;RecObj.setLength(4);RecObj.setWidth(2);cout << "length of rectangle is " << RecObj.length << endl;cout << "length of rectangle is " << RecObj.getLength() << endl;cout << "width of rectangle is " << RecObj.width << endl;cout << "area of rectangle is " << RecObj.Area() << endl;
}

3、总结

       继承是面向对象编程中实现代码重用和扩展的重要机制。通过继承,子类可以扩展基类的功能,或者在基类的基础上添加新的功能。使用修饰符public、private、protected可以对已有类中功能进行保留和舍去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt xml学习之calculator-qml

1.功能说明&#xff1a;制作简易计算器 2.使用技术&#xff1a;qml,scxml 3.项目效果&#xff1a; 4.qml部分&#xff1a; import Calculator 1.0 //需要引用对应类的队友版本 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 1.4 import QtScxml…

Linux 的权限

目录 Linux 的用户 root 用户 和 普通用户 如何新建普通用户&#xff1f; 如何切换用户&#xff1f; 一开始是以 root 用户登录&#xff1a; 一开始以普通用户登录&#xff1a; 如何删除用户&#xff1f; Linux文件权限 什么是读权限&#xff08; r &#xff09;&#…

牛客网输入输出11道题——python3版本

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录python3版本的常见输入输出。 2 训练 题目1&#xff1a;AB(1) python3代码如下&#xff0c; import sys for line in sys.stdin:a, b map(int, line.split())print(ab)题目2&#xff1a;AB(2) python3代码如下&#xff0c…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 、auto 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长&#xff0c;再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析&#xff0c;注释。 &#xff08;1 探讨一&#xff09;当独占指针指向数组时&#xff0c;其默认的删除器是…

Python3 逻辑运算符

前言 本文主要介绍python中的逻辑运算符&#xff0c;主要内容包括逻辑运算符简介、逻辑运算符优先级。 文章目录 前言一、逻辑运算符简介1、and(与) 运算2、or(或)运算3、not(非)运算 二、逻辑运算符优先级总结 一、逻辑运算符简介 逻辑运算符是用来做逻辑运算&#xff0c; …

13.RedHat认证-Linux Shell脚本

13.RedHat认证-Linux Shell脚本 Shell是一种脚本语言&#xff0c;那么&#xff0c;就必须有解释器来执行这些脚本。 bash&#xff1a;是Linux标准默认的shell。bash由Brian Fox和Chet Ramey共同完成&#xff0c;是BourneAgain Shell的缩写 sh&#xff1a;由Steve Bourne开发…

用大白话讲懂ceph与clinder的区别

Ceph是一个大仓库&#xff0c;而clinder只是食堂openstack的一个存储组件 详细解释如下&#xff1a; 当我们需要存储大量数据的时候&#xff0c;比如照片、视频、文件等&#xff0c;Ceph就像是一个巨大的仓库&#xff0c;可以帮助我们把这些数据安全地存放起来。 Ceph与传统的…

ABP框架+Mysql(二)

展示页面--图书列表页面 本地化 开始的UI开发之前,我们首先要准备本地化的文本(这是你通常在开发应用程序时需要做的).本地化文本在前端页面会常用。 本地化文本位于 Acme.BookStore.Domain.Shared 项目的 Localization/BookStore 文件夹下: 打开 en.json (英文翻译)文件并更…

STM32-- GPIO->EXTI->NVIC中断

一、NVIC简介 什么是 NVIC &#xff1f; NVIC 即嵌套向量中断控制器&#xff0c;全称 Nested vectored interrupt controller 。它 是内核的器件&#xff0c;所以它的更多描述可以看内核有关的资料。M3/M4/M7 内核都是支持 256 个中断&#xff0c;其中包含了 16 个系统中…

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些&#xff1f;并且直到它们的作用&#xff0c;并且演示这些函数的使用。 二、数值函数 常见的数值函数如下&#xff1a; 注意&#xff1a; 1、ceil(x)、floor(x) &#xff1a;向上、向下取整。 2、mod(x,y)&#xff1a;模运算&#x…

Kmeans聚类模型

K均值(K-Means)聚类是一种常用的无监督学习算法,用于将数据集中的样本划分为K个不同的簇(cluster),使得每个样本都属于距离最近的簇的中心。K均值聚类的目标是通过最小化簇内样本的方差或欧氏距离的平方和来确定簇的中心,从而实现聚类分析。 一、Kmeans聚类模型原理 随…

CTF本地靶场搭建——GZ:CTF基础使用

GZ::CTF 是一个基于 ASP.NET Core 的开源 CTF 平台。 简介 GZ::CTF 是一个基于 ASP.NET Core 的开源 CTF 平台&#xff0c;采用 Docker 或 K8s 作为容器部署后端&#xff0c;提供了可自定义的题目类型、动态容器和动态分值功能。 本项目缘起于作者认为 CTFd 的实现不优雅&a…

Photoshop 首选项设置建议

Windows Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K macOS Ps菜单&#xff1a;Photoshop/首选项 Photoshop/Preferences 快捷键&#xff1a;Cmd K 对 Photoshop 的首选项 Preferences进行设置&#xff0c;可以提高修图与设计效率。下面是一些…

burp插件new_xp_capcha识别验证码的简易安装

1.new_xp_capcha 插件是大佬开发的可以正常白嫖&#xff0c;感谢大佬&#xff0c;我找了个不需要任何高级操作就可以做的安装手法&#xff0c;因为我在网上搜了一下就发现这个的安装过程攻略都还蛮复杂&#xff0c;我这里用了个简单的手法 2.安装 下载地址&#xff1a;smxia…

用Python获取Windows本机安装的所有应用程序的实现与分析

一个项目中需要获取本机安装的所有应用程序列表&#xff0c;花了一点时间研究了一下&#xff0c;分享出来。 主要通过访问注册表和桌面快捷方式来完成这一任务&#xff0c;因为注册表中获取到的应用程序列表不完全&#xff0c;因此通过桌面快捷方式进行补充。 导入所需模块 im…

上网是不是必须路由器和光猫之一负责拨号?

链接&#xff1a;https://www.zhihu.com/question/624856022/answer/3245182557 上网并非一定要“拨号”&#xff0c;使用固定IP地址可以直接上网&#xff0c;不需要拨号。你们公司的宽带属于商用宽带&#xff0c;运营商&#xff08;电信&#xff09;给配置了固定的IP&#…

Python面试宝典:Python中与单元测试相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十章:测试和调试:第一节:单元测试】 第二十章:测试和调试第一节:单元测试单元测试的关键概念:Python中的单元测试工具:使用unittest模块编写单元测试的基本步骤:示例代码面试…

不同程序猿的六一表情

初级 中级高级资深#猿脑2.0

小程序模板开发与定制开发的对比

一、引言 随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级的应用形态&#xff0c;已经深入到人们的日常生活和工作中。小程序以其无需安装、即用即走的特点&#xff0c;受到了广大用户的青睐。在小程序开发领域&#xff0c;模板开发和定制开发是两种常见的开发方式…

Linux: network: arp 导致问题一例

最近读openswitch的文档&#xff0c;看到下面一段话&#xff0c;说所有的CFM/BFD等协议&#xff0c;ARP修改相关的包都会经过slowpath/慢路径处理。 Performance Open vSwitch has a concept of a “fast path” and a “slow path”; ideally all packets stay in the fast pa…