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可以对已有类中功能进行保留和舍去。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx隐藏版本号、错误信息页面隐藏nginx软件、修改 HTTP 头信息中的connection 字段,防止回显具体版本号、curl命令

目录 安装之后隐藏 配置文件 源代码配置安装之前隐藏 修改nginx.h文件中的 13、14行 修改 HTTP 头信息中的connection 字段&#xff0c;防止回显具体版本号 配置文件49行 错误页面程序返回版本号、nginx隐藏 配置文件36行 ​编辑 安装nginx 相关选项说明 curl命令测试…

好用的linux链接工具

工具下载链接&#xff1a; FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本4.3.10,更新日期2023.12.31 - FinalShell官网FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.特色功…

mac电脑安卓设备文件传输助手:MacDroid pro 中文激活版

MacDroid Pro是一款专为Mac电脑和Android设备设计的软件&#xff0c;旨在简化两者之间的文件传输和数据管理&#xff0c;双向文件传输&#xff1a;支持从Mac电脑向Android设备传输文件&#xff0c;也可以将Android设备上的文件轻松传输到Mac电脑上。完整的文件访问和管理&#…

python的一种集成开发工具:PyCharm开发工具

一. 简介 本文简单了解两种 python语言所使用的 集成开发环境&#xff1a; PyCharm、vscode。 python语言学习中&#xff0c;可以任意选中这两个集成开发环境的一种就可以。本文先来简单学习 PyCharm开发工具安装与使用。 二. python的一种集成开发工具&#xff1a;PyChar…

智慧交通视频AI监控识别解决方案

背景分析 随着社会的进步和科技的不断发展&#xff0c;互联网技术和AI视觉分析技术日益成熟&#xff0c;为传统交通监控领域带来了新的发展机遇。AI视觉分析技术的引入&#xff0c;不仅提升了交通监控的智能化和自动化水平&#xff0c;还显著减轻了交管部门的工作负担&#xf…

wafw00f一键检测目标防火墙信息(KALI工具系列十五)

目录 1、KALI LINUX简介 2、wafw00f工具简介 3、在KALI中使用lbd 3.1 查看可检测的防火墙对象 3.2 目标防火墙种类检测 3.3 目标防火墙详细信息检测 3.4 将检查结果输出 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&#xff0c;广…

5步3分钟0基础搭建,轻松搭建《雾锁王国》私人服务器

继《幻兽帕鲁》游戏爆火之后&#xff0c;与它同类型的《雾锁王国》也是强力刷屏&#xff0c;不分伯仲&#xff0c;在 Steam 上的评分一直稳定在“特别好评”&#xff0c;让小伙伴们很“上头”。就在两者游戏玩家反响爆火的同时&#xff0c;官方服务器人数爆满&#xff0c;卡顿频…

TK防关联引流系统:全球TikTok多账号运营的神器

在TikTok的生态中&#xff0c;高效运营多个账号已成为品牌全球推广的必经之路。为此&#xff0c;TK防关联引流系统应运而生&#xff0c;它是一款专为TikTok设计的效率神器&#xff0c;助您迅速搭建并管理全球多账号矩阵。该系统由先进的“防关联智能终端”硬件和智能的“TK防关…

80个GitHub上c/c++学习项目推荐——拎几个出来写进简历

1.《30天自制C服务器》 ①语言&#xff1a;c ②来源&#xff1a;GitHub 目前star:4.8k ③项目地址&#xff1a;https://github.com/yuesong-feng/30dayMakeCppServer ④类型&#xff1a;免费 2.《btop》&#xff08;命令行资源监视器&#xff09; ①语言&#xff1a;c ②…

【活动】GPT-4O:AI语言生成技术的新里程碑

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 GPT-4O&#xff1a;AI语言生成技术的新里程碑引言GPT系列简史回顾GPT-1: 初露锋…

基础篇01——SQL的基本语法和分类

MySQL数据库安装与基本使用 安装教程参见&#xff1a;通过zip安装MySQL 通过命令行启动和停止MySQL服务命令 前提&#xff1a;安装MySQL成功之后 启动服务&#xff1a;net start mysql 停止服务&#xff1a;net stop mysql 通过命令行连接mysql 可以通过mysql的客户端命令行…

vivo X200系列即将发布:首发将搭载天玑最新芯片9400

随着智能手机技术的不断进步&#xff0c;vivo作为全球知名的智能手机制造商&#xff0c;一直在为用户带来创新和惊喜。最近&#xff0c;vivo的粉丝们有理由感到兴奋&#xff0c;因为最新的消息称&#xff0c;vivo X200系列即将发布&#xff0c;并且将首发搭载天玑最新的9400处理…

寺庙小程序-H5网页开发

大家好&#xff0c;我是程序员小孟。 现在有很多的产品或者工具都开始信息话了&#xff0c;寺庙或者佛教也需要小程序吗&#xff1f; 当然了&#xff01; 前面我们还开发了很多寺庙相关的小程序。 今天要介绍的是一款寺庙系统&#xff0c;该系统可以作为小程序、H5网页、安…

jenkins插件之plot

plot是一个生成图表的插件&#xff0c;这里我用于可视化phploc统计的数据 插件安装 进入 Dashboard --> 系统管理 --> 插件管理 --> Available plugins 搜索plot安装生成phploc分析数据 Dashboard --> 您的项目 --> Configuration点击 Build Steps点击 增加构…

【5】MySQL数据库备份-XtraBackup 安装报错 zstd

XtraBackup 安装报错 zstd 前言解决方案 前言 在 Linux 系统上安装 XtraBackup 过程中&#xff0c;遇到如下的报错&#xff08;… Requires: zstd …&#xff09;&#xff1a; --> Processing Dependency: zstd for package: percona-xtrabackup-80-8.0.35-30.1.el7.x86_…

postgressql——事务提交会通过delayChkpt阻塞checkpoint(9)

事务提交会通过delayChkpt阻塞checkpoint Postgresql事务在事务提交时&#xff08;执行commit的最后阶段&#xff09;会通过加锁阻塞checkpoint的执行&#xff0c;尽管时间非常短&#xff0c;分析为什么需要这样做&#xff1a; 首先看提交堆栈 #1 0x0000000000539175 in Co…

Python魔法之旅-魔法方法(08)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

安装VS2017后,离线安装Debugging Tools for Windows(QT5.9.2使用MSVC2017 64bit编译器)

1、背景 安装VS2017后&#xff0c;Windows Software Development Kit - Windows 10.0.17763.132的Debugging Tools for Windows默认不会安装&#xff0c;如下图。这时在QT5.9.2无法使用MSVC2017 64bit编译器。 2、在线安装 如果在线安装参考之前的文章&#xff1a; Qt5.9.2初…

vue3简单快速实现主题切换功能

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《vue3实战》 目录 内容概要 实现步骤 1.定义不同主题的css样式变量 2.入口main.ts中引入这个样式文件 3.主题样式css变量引用 4.设置默认主题样式 5.实现点击按钮主题切换 总结 最近发现了一个巨牛的人工智…

学习Python之后,可以做哪些兼职?月收入能有多少?一篇文章带你认识一下

学习Python之后&#xff0c;可以从事多种兼职工作。以下是一些可能的兼职方向及其相关描述&#xff1a; 兼职岗位&#xff1a; Python讲师&#xff1a;负责在线1对1授课&#xff0c;根据学员情况制定个性化教案&#xff0c;并定期汇报备课情况和教学进度。爬虫工程师&#xff1…