关于C++继承类和对象

2023-05-16

    继承是C++中一个很好的特性,它能够从已有的类派生出新的类,而继承类继承了原有类(称为基类)的特征。继承类有三种,公有继承、保护继承、私有继承。
    使用公有继承,基类的公有成员将成为继承类的公有成员,保护成员称为继承类的保护成员,基类的私有部分也将成为继承类的一部分,但只能通过基类的公有和保护方法来访问,但继承类不继承基类的构造函数、析构函数和赋值操作符。
    使用保护继承,基类的公有成员和保护成员都将成为继承类的保护成员,由于基类的公有方法在第二代为保护成员,因此第三代继承类可以使用。
    使用私有继承,基类的公有成员和保护成员都将成为继承类的私有成员,继承类不继承基类的接口。第三代继承类不能使用基类的接口。

 
 
 publicprotectedprivate
公有继承publicprotected不可见
私有继承privateprivate不可见
保护继承protectedprotected不可见
下面将通过几个例子来详细阐述这三者的区别:

第一个例子,继承类引用基类成员 
1.引用基类公有成员和保护成员:

class A
{
protected:
	void proA(){}
public:
	A():iA(10){}
	int iA;
	void funA(){}
};

class B: public A
{
public:
	void funB()
	{
		cout<<iA<<endl; 
		proA();
		funA();
	}	
};

class C: protected A
{
public:
	void funC()
	{
		cout<<iA<<endl; 
		proA();
		funA();
	}	
};

class D: private A
{
public:
	void funD()
	{
		cout<<iA<<endl;         //直接调用
		proA();
		funA();
	}	

	void funD2()
	{
		cout<<A::iA<<endl;     //通过“基类名+::”调用
		A::proA();
		A::funA();
	}
};

int main()
{
	A a;
	B b;
	C c;
	D d;

	b.funB();
	c.funC();
	d.funD();
	d.funD2();

	return 0;
}
编译通过 

结论1:不管是公有、保护还是私有继承,继承类都可以直接访问基类的公有成员及保护成员,可在继承类方法中直接调用或者通过“基类名+::”调用。static成员的引用在后面讨论。

2.引用基类私有成员

class A
{
	int iA;
public:
	A():iA(10){}
};

class B: public A
{
public:
	void funB()
	{
		cout<<iA<<endl; 
		cout<<A::iA<<endl; 
	}
};

int main()
{
	A a;
	B b;

	b.funB();

	return 0;
}
编译出错 

error C2248: “A::iA”: 无法访问 private 成员(在“A”类中声明) 

结论2:公有、私有和保护继承都无法访问基类的私有成员,只能通过基类的公有成员和保护成员访问

第二个例子,继承类对象引用基类成员 
1.公有继承:

class A
{
	int priA;
protected:
	void proA(){}
public:
	A():priA(10),iA(10){}
	int iA;
	void funA(){}
};

class B: public A{};

int main()
{
	A a;
	B b;

	cout<<b.priA<<endl;    //公有继承无法引用基类私有数据
	b.proA();              //公有继承无法引用基类保护方法
	cout<<b.iA<<endl;      //公有继承可以引用基类公有数据
	b.funA();              //公有继承可以引用基类公有方法

	return 0;
}
编译出错: 

error C2248: “A::priA”: 无法访问 private 成员(在“A”类中声明) 
error C2248: “A::proA”: 无法访问 protected 成员(在“A”类中声明) 
结论3:公有继承的对象可以访问基类的公有成员,但无法访问基类的私有成员和保护成员

2、对于私有继承和保护继承

class A
{
	int priA;
protected:
	void proA(){}
public:
	A():priA(10),iA(10){}
	int iA;
	void funA(){}
};

class C: protected A{};
class D: private A{};

int main()
{
	A a;
	C c;
	D d;

	cout<<c.iA<<endl;
	c.funA();

	cout<<d.iA<<endl;
	d.funA();

	system("pause");
	return 0;
}
编译出错: 

error C2247: “A::iA”不可访问,因为“C”使用“protected”从“A”继承 
error C2247: “A::funA”不可访问,因为“C”使用“protected”从“A”继承 
error C2247: “A::iA”不可访问,因为“D”使用“private”从“A”继承 
error C2247: “A::funA”不可访问,因为“D”使用“private”从“A”继承 
结论4:保护继承和私有继承的对象不能访问基类的公有、保护及私有成员

第三个例子,继承类和对象引用基类static成员

class A
{
public:
	static int siA;
	static void funA(){}
};

class B: public A{};

int A::siA=10;

int main()
{
	B b;

	cout<<B::siA<<endl;
	B::funA();

	cout<<b.siA<<endl;
	b.funA();

	return 0;
}
编译通过 

*结论5:公有继承通过类或对象都可以访问基类的公有static成员,通过“类+::”调用或者“对象+.”调用。私有继承和保护继承的类可以访问基类公有static成员,但类对象不能访问。对于类中static成员的具体使用可参考C++类中static成员使用 *

第四个例子,第三代类

class A
{
protected:
	void proA(){}
public:
	void funA(){}
};

class B: public A{};
class BB: public B
{
public:
	void funBB()
	{
		proA();
		funA();
	}
};

class C: protected A{};
class CC: protected C
{
public:
	void funCC()
	{
		proA();
		funA();
	}
};

class D: private A{};
class DD: private D
{
public:
	void funDD()
	{
		proA();
		funA();
	}

};

int main()
{
	BB bb;
	CC cc;
	DD dd;

	bb.funBB();
	cc.funCC();
	dd.funDD();

	return 0;
}
编译出错 

error C2248: “A::proA”: 无法访问 无法访问的 成员(在“A”类中声明) 
error C2247: “A::funA”不可访问,因为“D”使用“private”从“A”继承 
结论6:使用公有继承时,第三代类和对象都可以使用基类的公有方法;使用保护继承时,基类的公有方法在第二代为保护成员,因此第三代类可以使用,但第三类的对象不能使用;使用私有继承时,第三代类和对象将不能使用基类的所有方法。

总结:

  1. 公有、私有和保护继承都可以直接访问基类的公有成员以及保护成员
  2. 公有、私有和保护继承都无法直接访问基类的私有成员,只能通过基类的公有成员和保护成员访问
  3. 公有继承的对象可以访问基类的公有成员,但无法访问基类的私有成员和保护成员。私有继承和保护继承的对象不能直接访问基类的任何成员
  4. 公有继承的类或对象都可以访问基类的公有static成员。私有继承和保护继承的类可以访问基类公有static成员,但类对象不能访问。
  5. 使用公有继承时,第三代类和对象都可以使用基类的公有方法;使用保护继承时,基类的公有方法在第二代为保护成员,因此第三代类可以使用,但第三类的对象不能使用;使用私有继承时,第三代类和对象将不能使用基类的所有方法

PS: 码一篇文章还真TM累,走过路过的不要错过,留言增加点人气

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C++继承类和对象 的相关文章

  • Nrf52832 freeOS系统移植

    最近因为项目开发需要 xff0c 需要多任务的操作系统在nrf52832上运行 xff0c 于是根据例程移植了下FreeOS系统 根据例程F nRF5 SDK 15 2 0 9412b96 examples ble peripheral b
  • tf 使用

    1 发布自己的tf xff1a 其实就是发布你建立的坐标系 步骤如下 xff1a 1 定义一个广播 xff0c 相当于发布话题时定义一个发布器 xff0c 还是以官方的小乌龟例程为例 xff1a span class hljs keywor
  • 解决问题:xshell6评估已过期

    一 问题描述 今天打开xshell xff0c 发现报错 xff1a 34 xshell6评估过期 34 无法打开xshell xff0c 当时急着要用xshell xff0c 所以 xff0c 是有这个问题的 二 解决方法 1 进入xsh
  • 华为机试题: 水仙花数

    描述 水仙花数又称阿姆斯特朗数 水仙花数是指一个n 位数 n 3 xff0c 它的每个位上的数字的n 次幂之和等于它本身 xff08 例如 xff1a 1 3 43 5 3 43 3 3 61 153 xff09 求输入的数字是否为水仙花数
  • 【手把手教你树莓派3 (二)】 启动wifi模块

    概述 树莓派3内置了wifi和蓝牙模块 xff0c 我们不用像以前的版本那样 xff0c 再去购买一个外接的模块练到raspberry上 当我们第一次启动了树莓派的时候 xff0c 必然使用了网线 xff0c 但是之后的每一次使用 xff0
  • 社区活动 | Apache Kylin × Apache RocketMQ Meetup 深圳站

    9 月 7 日 xff0c Apache Kylin Meetup 即将走进深圳 xff01 本次 Meetup 由 Apache Kylin 与 Apache RocketMQ 联合举办 xff0c 邀请到来自腾讯 阿里 平安云以及 Ky
  • 【手把手教你树莓派3 (六)】使用 motion 和 mjpg 做视频监控器

    概述 买了一个罗技的usb接口的摄像头 xff0c 想通过raspberry pi做一个视频的实时监控器 xff0c 看了一下这各功能可以通过两款软件实现 xff1a motion和mjpg streamer xff0c 先来简单介绍下这两
  • 【zookeeper】data/zookeeper_server.pid: No such file or directory FAILED TO WRITE PID 报错

    今天在配置zk的伪集群 xff0c 发现了如下报错 xff1a 上网查看有的说是因为zoo cfg配置文件 61 前后有空格 xff0c 查了以后我的配置文件并没有空格 xff0c 所以我排除了这个原因 最后解决 xff1a zk的配置文件
  • golang tag 之 gomodifytags

    链接 xff1a gomodifytags原文链接 gomodifytags 是go工具 xff0c 用来修改 更新struct字段的标签tag 使用gomodifytags可以很方便的update add delete struct的字段
  • Vscode Clangformat 配置

    1 xff0c vscode 安装 c 43 43 intellisense 即可自动安装clangformat 格式化工具 2 xff0c vs setting Clang format path 配置 一般位置就是 vscode ext
  • 计算机基本原理之内存编址

    内存编址目的 存储器由一块块的空间 xff08 存储单元 xff09 组成 xff0c 为了方便寻找到每一块空间 xff0c 我们需要对每一个空间进行标识 内存编址 内存编址概述 芯片 存储器由若干个芯片构成 内存容量 存储器的大小 内存容
  • PowerDesigner—你知道CDM、LDM、PDM、OOM的区别吗?

    导读 在本篇文章中 xff0c 你将会了解到PowerDesigner工具中的三种模型CDM xff0c OOM xff0c PDM的区别和联系 PowerDesigner 简称PD xff0c 是一种数据建模工具 xff0c 适合于开发大
  • 基础 HTML之目录问题(相对路径和绝对路径区别)

    导读 复习HTML知识的时候 xff0c URL的路径的写法是我们经常会用到的一块内容 相对路径和绝对路径的问题不难 xff0c 只要明白各自的道理 xff0c 同时清楚 这些字符的含义就可以了 原文链接 xff1a http www jb
  • 【Android开发—智能家居系列】(一):智能家居原理

    来到JCZB公司的第二天 xff0c 就接到了开发类似于小米智能家庭APP的任务 组长让我在手机上安装上此款APP xff0c 给了我个小米智能插座 xff0c 就让我开始了解需求 这便开启了我的智能家居旅程 说实话 xff0c 我也真是o
  • 【Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中 xff0c 我开发的这款APP是用来连接温控器 xff0c 并对温控器进行控制的 有图为证 xff0c 哈哈 上一篇文章 Android开发 智能家居系列 xff08 一 xff09 xff1a 智能家居原理 的文末总结中写到
  • 【POI】——获得单元格的值,并转化成字符串

    本篇文章分享一些在做导入导出EXCEL功能时用到的工具类的一些代码 span class hljs javadoc span class hljs javadoctag 64 param span cell span class hljs
  • ElementUI实现文件手动上传

    ElementUI实现文件手动上传 HTML部分 lt el upload ref 61 34 upload 34 multiple 61 34 true 34 file list 61 34 fileList 34 auto upload
  • 【工具篇】——利用EditPlus进行Json数据格式化

    从接口返回的数据基本都是json格式的数据 之前我要查看数据的内容 xff0c 为了方便我阅读 xff0c 我会直接复制这段数据到在线JSON校验格式化工具中进行格式化和校验 但是没网的时候 xff0c 就不能靠它了 而EditPlus是我
  • 【GIS】——mapnik在windows上的安装

    mapnik是瓦片生成器 这里先不解释了 xff0c 等用过了再谈理解 下载步骤 1 下载安装包 官网地址 xff1a http mapnik org http mapnik org pages downloads html 3 0 12还
  • 【GIS】——使用Python bindings操作mapnik

    背景介绍 使用mapnik有三种方式 xff1a 1 使用XML配置文件 2 使用Python bindings 3 使用C 43 43 中的API 这里我们先介绍第二种Python bindings xff0c 并采用这种方式做一个Dem

随机推荐

  • 【MongoDB】(一)——关于MondoDB索引的总结

    导读 为数据创建索引有助于提高查询数据的性能 xff0c 本篇文章总结了创建MongoDB索引应遵循的规则 我将这些规则分成四类 xff1a 1 query 2 sort 3 RAM 4 selectivity query db span
  • 【开发也是好测试】(四)—Mock

    有关Mock的思维导图 xff1a
  • 【MongoDB】——TTL Index

    TTL Index
  • ubuntu下的串行口通讯编程

    Linux 操作系统从一开始就对串行口提供了很好的支持 xff0c 本文就 Linux 下的串行口通讯编程进行简单的介绍 串口简介 串 行口是计算机一种常用的接口 xff0c 具有连接线少 xff0c 通讯简单 xff0c 得到广泛的使用
  • stm32 摄像头寻迹+平衡车

    链接 xff1a http download csdn net download u010925447 9866006
  • 【书籍推荐】自己动手写操作系统

    于渊 编著 尤晋元 审校 2005年8月出版 ISBN 7 121 01577 3 48 00元 xff08 含光盘1张 xff09 374页 用理论指导动手实践 xff0c 用实践深化理解理论 xff01 本书在详细分析操作系统原理的基础
  • 贝塔、伽马分布

    最近开始自学PRML xff0c 为此又补了概率论中的一些知识点 相较于古典概率通过各种估计手段来确定参数的分布 xff0c 贝叶斯学派则是使用后验概率来确定 xff0c 为了方便计算后验概率 xff0c 引入共轭先验分布来方便计算 xff
  • elementUI中el-dropdown的command如何传递多个参数

    el dropdown的command事件默认传递一个参数 xff0c 即每个下拉选项el dropdown item中设定的command的值 xff0c 那么如何传递多个参数呢 xff1f 实现方法 xff1a 动态设置el dropd
  • 记录ubuntu18.04下搭建nuttx RTOS的过程

    官方参考链接 xff1a https nuttx apache org docs latest quickstart install html Getting started 61 61 gt Installing 主要记录一下按照链接指导
  • 词袋

    brief描述子 一般Sb 61 48 Lb为256 brief描述子不具备旋转尺度不变性 词袋 提取大量图片的描述子 xff0c 将描述子用k means聚类成K堆 xff0c 这是第n层 xff0c 把每一堆再次聚类形成下一层 xff0
  • 板子和电脑配置ros通信

    它们需要连在同一个路由器上 1 获取板子和电脑的ip 比如板子名为RV1126 RV1109 xff0c ip为192 168 5 48 电脑名为qian hw xff0c ip为192 168 5 25 2 在电脑端设置 xff1a ba
  • 通过跟踪效果来看vins输出结果

    下面是vins跑出来的结果 xff0c vio输出是绿线轨迹 线速度是0 28m s xff0c 拐角的地方是我根据蓝线把vio轨迹掰正了 vio在初始阶段走的比较弯曲 xff0c 后有一段笔直的轨迹 xff0c 这里旋转非常慢 xff0c
  • vins-fusion 融合rtk原理

    vins fusion融合rtk原理 xff1a 使用优化的方式融合 xff0c 假设融合后的位姿是fusion T n vio输出的位姿是vio T n xff0c rtk输出的位姿是rtk T 只有最后一帧 那么 fusion T的初值
  • Docker 方式搭建 Prometheus + grafana

    prometheus 官方仓库 prometheus 官方文档 GETTING STARTED 参考 基于docker 搭建Prometheus 43 Grafana的过程详解 按照官方仓库文档中写的 Docker images Docke
  • 报错:The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY

    apt update 最后报错 sudo apt update 报错 91 packages can be upgraded Run 39 apt list upgradable 39 to see them W An error occu
  • ubuntu上 eclipse+arm-linux-gcc+jlink+s3c2440a开发环境搭建

    0 环境搭建概述 所需工具 xff1a xff08 1 xff09 Eclipse Eclipse的本身只是一个框架平台 xff0c 但是众多插件的支持 xff0c 使得Eclipse拥有较好的灵活性 xff08 2 xff09 CDT C
  • 在函数里修改全局变量

    names 61 39 Lilei 39 def change name global name 全局变量我来撑控 names 61 39 Hi 39 print names change name 39 Hi 39 print names
  • 守护进程详解及创建,daemon()使用

    转载于 xff1a http www cnblogs com mickole p 3188321 html 侵删 一 xff0c 守护进程概述 Linux Daemon xff08 守护进程 xff09 是运行在后台的一种特殊进程 它独立于
  • 在VsCode中如何使用Git

    大部分前端都是用VsCode作为代码编辑器 xff0c 那么我们如何在VsCode中使用Git呢 xff1f 准备工作 xff1a 1 在vscode中安装插件GitLens 使用教程 xff1a 1 点击文件 新建窗口 2 克隆git仓库
  • 关于C++继承类和对象

    继承是C 43 43 中一个很好的特性 xff0c 它能够从已有的类派生出新的类 xff0c 而继承类继承了原有类 xff08 称为基类 xff09 的特征 继承类有三种 xff0c 公有继承 保护继承 私有继承 使用公有继承 xff0c