【笔记总结】C++面向对象三大特征(四大特征)

2023-10-27

C++面向对象的三大特征(四大特征)

三大特征:封装、继承、多态
四大特征:抽象、封装、继承、多态

一、类和对象

  • 什么是类,什么是对象,类和对象的区别?

是数据类型,是具有相同属性和服务的一组对象的集合。对一类对象的抽象就是类。
对象即观察研究对象,是类这种数据类型创建出的实例(相当于结构变量)。

类与对象的区别:
1、类是一个抽象的概念,类只是为所有的对象定义了抽象的属性和行为;对象是类的一个具体,是实体。
2、类是静态概念,本身不携带任何数据;对象是动态概念,每个对象都有自己独特的属性和行为,且它的属性可以随着行为而发生改变。

注意:C++中类和结构的区别只有成员函数和成员变量默认访问权限不同。

二、类的继承

1、一个子类可以同时继承多个父类,每个父类的继承方式可以相同也可以不同。

	class 子类:继承方式 父类,...{}

2、继承的基本特点:

  • 子类会继承父类的所有成员,但不能访问父类中的私有成员
  • 子类的指针或引用可以隐式转换成父类的指针或引用
  • 子类会隐藏父类的同名成员
    1、可通过域限定符进行访问
    2、可以使用父类的指针或引用来指向子类对象

3、继承方式影响访问控制
①访问控制限定符访问控制限定符
注意:private子类需要调用父类的成员函数来访问
友元与内部的区别,友元需要类的指针或引用

  • 总结:
    public成员在类内、子类中、外部都可以随意访问
    private成员只能在类中才能访问,外部不能访问
    protected成员在类内和子类中都可以访问,即只能被类内或子类访问,但不能被子类的对象访问(属于外部)

②继承方式
继承方式影响范围

  • 总结:
    C++中的继承方式有public、private、protected三种(它们直接影响到子类的成员及其对象对父类成员访问的规则)
    public(公有继承):父类中各成员属性不变,且父类中private成员被隐藏;子类成员只能访问父类中的public、protected成员;子类对象只能访问父类的public成员
    private(私有继承):父类中各成员属性均变为private,且父类中private成员被隐藏;子类成员只能访问父类中的public、protected成员;子类对象不能访问父类的任何成员
    protected(保护继承):父类中各成员属性均变为protected,且父类中private成员被隐藏;子类成员只能访问父类中的public、protected成员;子类对象不能访问父类的任何成员

4、子类的构造、析构、拷贝
构造函数:先(根据继承表顺序)执行父类的构造函数→执行子类的构造函数
(默认执行父类的无参构造)
析构函数:先执行子类析构→(根据继承表逆顺序)执行父类的析构函数
拷贝构造:当使用子类对象来初始化新的子类对象时,会自动调用子类缺省的拷贝构造函数,并且会先调用父类缺省的拷贝构造函数。

三、虚函数、覆盖、多态

1、虚函数:类的成员函数前加virtual
2、覆盖:子类会覆盖父类的虚函数
3、多态:当子类覆盖了父类的虚函数时,通过父类指针指向子类对象时,调用虚函数,会根据具体的对象是谁来决定执行谁的函数。

  • 覆盖的条件
    1、父类中的成员函数必须是虚函数
    2、必须是父子类之间(不同作用域)
    3、函数名相同,参数列表完全一致
    4、返回值必须是同类或父子类
    5、const属性也会影响覆盖结果
  • 隐藏的条件
    1、子类与父类的函数完全相同,且父类函数不是虚函数,此时父类函数会被隐藏
    2、子类和父类函数同名,参数列表不同,此时父类函数会被隐藏
  • 多态的条件
    1、父子类之间有覆盖关系的函数
    2、父类的指针或引用指向子类对象
  • 函数重载的条件
    1、在同一作用域下
    2、函数名必须相同
    3、参数列表不同
  • 构造函数和析构函数能否是虚函数
    1、构造函数不能是虚函数,析构函数可以是虚函数。
    2、当使用delete释放一个父类指针时不管指向的对象是谁都只会调用父类的析构函数,此时若子类中有资源还未释放就会造成内存泄漏,因此在多态条件下,需要把父类的析构函数设置为虚函数(析构函数在进行覆盖时不会比较函数名),当父类的析构为虚函数时,通过父类指针或引用释放子类对象时,会自动调用子类的析构函数,而子类的析构函数执行完成后会自动调用父类的析构函数,从而避免内存泄漏。
实现类的工厂模式

工厂模式:在创建对象时通过一个共同的接口来指向新创建的对象。

#include <iostream>
using namespace std;

enum ClassType{typeA,typeB,typeC,typeD};
class Base
{
public:
	virtual void whoami(void)=0;//设置纯虚函数用来约束子类
};

class A:public Base
{
	void whoami(void)
	{
		cout<<"A"<<endl;
	}
};

class B:public Base
{
	void whoami(void)
	{
		cout<<"B"<<endl;
	}

};

class C:public Base
{
	void whoami(void)
	{
		cout<<"C"<<endl;
	}

};

class D:public Base
{
	void whoami(void)
	{
		cout<<"D"<<endl;
	}

};


Base* CreateClass(ClassType type)
{
	switch(type)
	{
		case typeA:return new A;
		case typeB:return new B;
		case typeC:return new C;
		case typeD:return new D;
	}
	return NULL;
}

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

【笔记总结】C++面向对象三大特征(四大特征) 的相关文章

  • 初步使用openEuler华为欧拉Linux系统

    使用openEuler 1 下载镜像文件 2 启动虚拟机软件安装虚拟机 3 开始配置系统 4 开始使用 5 安装桌面 5 1 安装必备的字体 5 2设置桌面图形化界面 5 3安装ukui 5 4重启 6 整体评价 参考文献 1 下载镜像文件
  • Html+css(第一天)

    基础认识 1 五大浏览器有哪些 IE浏览器 火狐浏览器 Firefox 谷歌浏览器 Chrome Safari浏览器 欧朋浏览器 Opera 2 相同的网页在不同浏览器中显示效果会完全一致吗 因为不同浏览器渲染引擎不同 解析的效果会存在差异
  • 编程思想:面向对象和面向过程

    何谓面向对象 何谓面向过程 对于这编程界的两大思想 一直贯穿在我们学习和工作当中 我们知道面向过程和面向对象 但要让我们讲出来个所以然 又感觉是不知从何说起 最后可能也只会说出一句就是那样啦 你知道啦 而这种茫然 其实就是对这两大编程思想的
  • linux系统在当前目录下创建子目录,linux根目录下一级子目录

    linux上每一个文件都必须是在根文件系统下的某个路径或者是从根文件系统才可以访问 文件系统中只分为目录和文件 所有文件都是存放在目录下 root根目录用 表示 ls 查看根目录下的一级子目录 boot 存放系统启动相关的文件 如内核文件
  • 地址解析中文乱码

    function Params var pattern w a zA Z0 9 u4e00 u9fa5 ig params 定义正则表达式和一个空对象 decodeURIComponent window location href true
  • 【数据结构】包装类&简单认识泛型

    文章目录 1 包装类 1 1 基本数据类型和对应的包装类 1 2 装箱和拆箱 2 什么是泛型 3 引出泛型 3 1 语法 4 泛型类的使用 4 1 语法 4 2 示例 4 3 类型推导 Type Inference 5 泛型的上界 5 1
  • E9流程表单中动态自定义添加button js代码

  • 发现一款专为.NET WinForms开发的数据可视化图表库

    FastReport是快捷 轻量级报表工具 使用简单 功能丰富 性价比高 适合个人 中小型企业和项目使用 FastReport近期推出了全新专为 NET WinForms开发的数据可视化图表库FastReport Business Grap
  • echarts水波球特效(附带外边框进度条)

    echarts水波球特效 附带外边框进度条 1 话不多说先上效果图 2 这里用到了echarts的liquidFill图表 需要加载liquidFill插件 npm i echarts liquidFill save 3 在main js入
  • c++ vector容器函数说明

    构造函数 vector 默认构造函数 创建一个空的 vector 对象 vector size type n 创建一个包含 n 个元素的 vector 对象 每个元素的值都是类型的默认值 vector size type n const v
  • yii2-admin扩展自定义目录

    yii2 admin文件如下 仓库地址 https github com mdmsoft yii2 admin tree master 复制yii2 admin文件至自定义目录 比如我就复制到了common rbac目录 在配置文件comm
  • 如何动态调试Python的第三方库

    注意 本文方法仅限于调试安装时附带py源码的库 如sklearn 引入 用sklearn中的sklearn feature extraction text TfidfTransformer来获取TF特征 但发现sklearn的计算结果与我手
  • 使用变量时,单引号、双引号、反向单引号的区别

    单引号 双引号 反向单引号的区别 1 单引号 当变量内容用单引号 时 对里面的命令echo和变量USER都无法识别 只识别成字符串本身 称之为强引用 2 双引号 当变量内容用双引号 时 是不能识别出里面的命令echo的 但可识别出里面的变量
  • 码农干货系列【1】--方向包围盒(OBB)碰撞检测

    码农干货系列 1 方向包围盒 OBB 碰撞检测 2012 06 07 11 40 by 当耐特 9251 阅读 20 评论 收藏 编辑 干货 最近一直在删文章 不是要关博洗手什么的 而是被删的文章没有达到 干货 的标准 干货的反义词是水货
  • tensorflow命令行参数之boolean使用的说明(踩坑指南)

    问题描述 简而言之就是 参数输出值与命令行输入值不一致 比如我们有个main py 具体代码如下 import tensorflow as tf tf app flags DEFINE boolean if gpu True if use
  • HTML网页链接

    1 链接的基本认识 所谓链接 是指一个页面之向一个目标的链接关系 链接地址不仅仅是一个页面地址 也可能是一个文件地址或者邮箱地址 文本链接 图像链接 邮箱地址的写法 a href 2 同一页面中快速查找消息 通过设置a标签中src内容的 来
  • Flutter Timer 定时器

    Flutter Timer 定时器 引包 Timer 类存在于dart async内 所以我们需要先导入 import dart async 使用场景 1 回调只需要一次 2 回调多次 例 回调一次 Duration timeout Dur
  • 玩转Matplotlib绘制柱形图

    使用Python Matplotlib模块中的bar 函数绘制柱形图 可视化直观地对比数据 代码如下 import pandas as pd import numpy as np import matplotlib pyplot as pl
  • **开启我的51单片机学习之路,基于51单片机数码管显示电子时钟**

    1 此款电子时钟 时间可以设置 有4个按键 一个功能按键 一个加 一个减 一个确定按键 2 按下功能按键一下 时钟走时停止 时两位数码管闪烁 代表此时再调时状态 这个时候加减按键就可以调整时钟 再次按下功能按键 就可以调整分钟 再按一下功能
  • Linux 音视频开发杂记之三-wayland环境搭建

    一 环境安装与运行测试程序 安装测试程序 Weston是Wayland提供的示例程序 sudo apt install weston 运行Weston 如果设置了 DISPLAY 那么Weston将在一个窗口中的X下运行 并从X中获取输入

随机推荐

  • 关于opencv更改摄像头参数(帧率,分辨率,曝光度……)的几个问题

    1 适用于VideoCapture打开的摄像头 VideoCapture capture 0 设置摄像头参数 不要随意修改 capture set CV CAP PROP FRAME WIDTH 1080 宽度 capture set CV
  • Basic Object-oriented Programming___CH_13

    13 1 Welcome to object oriented programming Object oriented programming OOP provides us with the ability to create objec
  • vue简单实现点击加1功能

    实现点击按钮输入框里 1 这里选择自己的vue地址 div div
  • Python爬虫入门教程:爬取csdn文章保存成PDF

    本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 基本开发环境 Python 3 6 Pycharm wkhtmltopdf 相关模块的使用 pdfkit requests parsel 安
  • 如何查看服务器内存及cpu信息,查看服务器当前内存cpu信息

    查看服务器当前内存cpu信息 内容精选 换一换 设备实时状态查询是检测设备在运行过程中的状态信息 用户可任选以下指令之一查看设备实时状态查询命令的可用参数 ascend dmi i hascend dmi i help各参数解释如表1所示
  • Mask-RCNN中的损失函数

    对每个ROI来说 多任务损失函数如下 mask分支对于每个RoI有Km2 维度的输出 K个 类别数 分辨率为m m的二值mask 因此作者利用了a per pixel sigmoid 并且定义 Lmask 为平均二值交叉熵损失 the av
  • ORA-12638: 身份证明检索失败 的解决办法

    the NTS option makes the Oracle client attempt to use your current Windows domain credentials to authenticate you with t
  • 水星路由器设置成交换机

    修改LAN口就可以
  • 两个esp8266透传用法

    电赛校赛在5月末结束 写一下这残酷的心路历程 得了校一哈哈哈 应该的应该的 毕竟花的钱比别的组少 先讲一下小车通信模块WiFi 老师说我们小题大做了 可是学通信用蓝牙太屈才啦 找遍全网都是这样连 这是错的 困扰了我们好久 差点退货 RST跟
  • python中的模块和包

    文章目录 Python中的模块 模块的具体使用 Python中的包 Python中的模块 模块 module 模块化 模块化指将一个完整的程序分解为一个一个小的模块 通过将模块组合 来搭建出一个完整的程序 不采用模块化 统一将所有的代码编写
  • java 纯面向对象_为什么Java不是纯面向对象的编程语言?

    1 首先我们将了解什么是面向对象的语言 当我们谈论所有关于对象的事物时 即 基于对象的数据表示 基于对象的方法表示 2 Java不是纯面向对象的 这意味着我们可以用或不用对象来表示数据 即 不用对象就可以表示很少的数据意味着不需要对象 情况
  • QT常用界面设计组件----SpinBox

    控件简介 SpinBox用于整数的显示与输入 一般显示为十进制 也可以显示二进制和十六进制的数 而且可以在显示框增加前缀和后缀 QDoubleSpinBox用于浮点数的显示和输入 可以设置显示小数位数 也可以设置显示的前缀和后缀 它们都是Q
  • linux-修改主机名的正确方式

    序 面对大量服务器 我们希望每一台服务器都有自己的名字 这样便于使用和管理 修改主机名 就是修改下图中这个位置的名字 修改主机名的方法主要有临时生效和永久生效两种 1 临时生效 所谓临时生效 就是在服务器不重启的情况下 临时改变主机名 通过
  • Type Library

    Type Library A typelib stores information about a COM object The classid the interfaces that the object supports the met
  • 自定义异常(实现登录)

    目录 异常 在Java中 将程序执行过程中发生的不正常行为称为异常 为什么要自定义异常呢 实现异常 用户登录功能 前言 在写自定义异常之前 我们要先简单了解何为异常 为什么要自定义异常 异常 在Java中 将程序执行过程中发生的不正常行为称
  • UI和UI有什么不同,是如何协助的

    UX 用户体验 和UI 用户界面 是一个常用的术语 然而 尽管有复杂的联系 但网页设计的两个领域是两个不同的东西 事实上 有可能有一个用户界面优秀但用户体验差的网站 因此 了解UX和UI良好的网页设计非常重要 这里简要介绍一下 UX和UI它
  • 数据库的设计(E-R图,数据库模型图,三大范式)

    一 数据库设计的概念 数据库设计是将数据库中的数据实体及这些数据实体之间的关系 进行规划和结构化的过程 二 数据库设计的重要性 如果一个数据库没有进行一个良好的设计 那么这个数据库完成之后他的缺点是 1 效率会很低 2更新和检索数据时会出现
  • SpringMVC使用stringHttpMessageConverter

    SpringMVC使用stringHttpMessageConverter 场景演示 解决方法 场景演示 当使用 ReponseBody注解的时候 我们知道返回值会被转换成 Json格式 然而里面的中文可能会被转换成乱码 如下面代码中的 测
  • 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中 这样每个线程使用自己的对象实例 彼此不会影响达
  • 【笔记总结】C++面向对象三大特征(四大特征)

    C 面向对象的三大特征 四大特征 三大特征 封装 继承 多态 四大特征 抽象 封装 继承 多态 一 类和对象 什么是类 什么是对象 类和对象的区别 类是数据类型 是具有相同属性和服务的一组对象的集合 对一类对象的抽象就是类 对象即观察研究对