当前位置: 首页 > news >正文

13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)

虚析构函数

        存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数)

纯虚函数

        纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范

   抽象类:

        含有纯虚函数的类,不可以实例化(不可以创建对象)

        抽象类也可以包含非纯虚函数、成员变量

        如果父类是抽象类,子类没有完全实现纯虚函数,那么这个子类依然是抽象类

#include<iostream>
using namespace std;
struct Animal
{virtual void speak() = 0;virtual void run() = 0;
};
struct Dog:Animal
{void speak() {cout << "Dog::speak()" << endl;}void run() {cout << "Dog::run()" << endl;}
};
struct Cat:Animal
{void speak() {cout << "Cat::speak()" << endl;}void run() {cout << "Cat::run()" << endl;}
};
int main() {Animal* cat = new Cat();cat->run();return 0;
}

多继承

        C++允许一个类可以有多个父类(不建议使用,会增加程序设计复杂度)

#include<iostream>
using namespace std;
struct Student
{int m_score;void study() {cout << "Student::study()-score=" << m_score << endl;}
};
struct Worker
{int m_salary;void work() {cout << "Worker::work()-salary=" << m_salary << endl;}
};
struct Undergragduate:Student,Worker
{int m_grade;void play() {cout << "Undergragduate::play()-grader=" << m_grade << endl;}
};
int main() {Undergragduate ug;ug.m_grade = 10;ug.m_salary = 20;ug.m_score = 30;ug.study();ug.work();ug.play();return 0;
}

多继承-虚函数

        如果子类继承得多个父类都有虚函数,那么子类对象就会产生对应的多张虚表

菱形继承

   菱形继承带来的问题:

  •         最底下子类从基类继承的成员变量冗余、重复
  •         最底下的子类无法访问基类的成员,有二义性
  •         Undergraduate对象大小为20个字节

 虚继承

  •         虚继承可以解决菱形继承带来的问题
  •         Person类被称为虚基类

#include<iostream>
using namespace std;
struct Person
{int m_age;
};
struct Student:virtual Person
{int m_score;
};
struct Worker:virtual Person
{int m_salary;
};
struct Undergragduate :Student, Worker
{int m_grade;
};
int main() {Undergragduate ug;//ug.m_grade = 10;//ug.m_salary = 20;//ug.m_score = 30; return 0;
}

 静态成员(static)

        静态成员:被static修饰的成员变量\函数

        可以通过对象(对象.静态成员)、对象指针(对象指针->静态成员)、类访问(类名::静态成员)

  静态成员变量:

  1.         存储在数据段(全局区,类似于全局函数),整个程序运行过程中只有一份内存
  2.         对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的
  3.         必须初始化,必须在类外面初始化,初始化时不能带static,如果类的声明和实现分离(在实现.cpp中初始化)

   静态成员函数:

  1.          内部不能使用this指针(this指针只能用在非静态成员函数内部),即不需要传入调用者的地址给this
  2.         不能是虚函数,(虚函数只能是非静态成员函数)理解:因为虚函数主要是用来实现多态的,用于对象的调用
  3.         内部不能访问非静态成员变量\函数,只能访问静态成员变量\函数
  4.         非静态成员函数内部可以访问静态成员变量\函数
  5.         构造函数和析构函数不能是静态的
  6.         当声明和实现分离时,实现部分不能带static
#include<iostream>
using namespace std;
class Car {
public:static int m_price;void run() {cout << "run()" << endl;}
};
int Car::m_price = 0;
int main() {Car car;car.m_price = 100;Car car1;car1.m_price = 200;Car::m_price = 300;return 0; 
}

相关文章:

13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)

虚析构函数 存在父类指针指向子类对象的情况&#xff0c;应该将析构函数声明为虚函数&#xff08;虚析构函数&#xff09; 纯虚函数 纯虚函数&#xff1a;没有函数体且初始化为0的虚函数&#xff0c;用来定义接口规范 抽象类&#xff1a; 含有纯虚函数的类&#xff0c;不可以实…...

Android DataBinding 自定义View实现数据双向绑定

看不懂的可以先看看单向数据绑定&#xff1a;Android DataBinding数据变化时自动更新界面_皮皮高的博客-CSDN博客 然后再确定已经启动了dataBinding的情况下&#xff0c;按下面的顺序来&#xff1a; 首先创建一个自定义View&#xff1a; import android.content.Context imp…...

网络安全中的渗透测试主要那几个方面

渗透测试中主要有软件测试和渗透测试。 1、测试对象不同 软件测试&#xff1a;主要测试的是程序、数据、文档。 渗透测试&#xff1a;对象主要为网络设备、主机操作系统、数据库系统和应用系统。 2、测试内容不同 软件测试&#xff1a;主要工作内容是验证和确认&#xff0c;发…...

Cursor:GPT-4 驱动的强大代码编辑器

Cursor &#xff08;https://www.cursor.so/&#xff09;是 GPT-4 驱动的一款强大代码编辑器&#xff0c;可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜&#xff0c;如下…...

C/C++中for语句循环用法及练习

目录 语法 下面是 for 循环的控制流&#xff1a; 实例 基于范围的for循环(C11) 随堂笔记&#xff01; C语言训练-计算1~N之间所有奇数之和 题目描述 输入格式 输出格式 样例输入 样例输出 环形方阵 干货直达 for 循环允许您编写一个执行特定次数的循环的重复控制结构。…...

AnimatorOverrideController说明

unity-AnimatorOverrideControllerhttps://docs.unity.cn/cn/current/ScriptReference/AnimatorOverrideController.html 用于控制动画器重写控制器的接口。 动画器重写控制器的用途是重写某个控制器的动画剪辑&#xff0c;从而为给定化身定制动画。 在运行时基于相同的 Anim…...

1.4、第三阶段 MySQL数据库

root数据库技术 一、数据库理论 1 什么是数据库技术 数据库技术主要研究如何组织、存储数据&#xff0c;并如何高效地提取和处理数据。 2 什么是SQL SQL&#xff08;Structured Query Language&#xff09;结构化查询语言 SQL是操作数据库的命令集&#xff0c;也是功能齐全的…...

LeetCode:202. 快乐数

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;202. 快乐数 题目描述&#xff1a;编写一个算法来判断一个数 n 是不是快…...

Android 14 新功能之 HighLights:快速实现文本高亮~

日常开发中可能会遇到给 TextView 的全部或部分文本增加高亮效果的需求&#xff0c;以前可能是通过 Spannable 或者 Html 标签实现。 升级 Android 14 后就不用这么迂回了&#xff0c;因其首次引入直接设置高亮的 API&#xff1a;HighLights。需要留意的是 HighLights API 和 …...

[渗透教程]-004-嗅探工具-Nmap

文章目录 Nmap介绍基本操作进阶操作Nmap介绍 nmap是一个网络扫描和主机检测工具,它可以帮助用户识别网络上的设备和服务。获取主机正在运行哪些服务,nmap支持多种扫描,UDP,TCP connect(),TCP SYN(半开扫描) ftp代理,反向标志,ICMP,FIN,ACK扫描,ftp代理,反向标志,ICMP. 可以用于…...

大数据技术之Hive SQL题库-初级

第一章环境准备1.1 建表语句hive>-- 创建学生表 DROP TABLE IF EXISTS student; create table if not exists student_info(stu_id string COMMENT 学生id,stu_name string COMMENT 学生姓名,birthday string COMMENT 出生日期,sex string COMMENT 性别 ) row format delim…...

常见HTTP状态码汇总

文章目录1xx: 信息2xx: 成功3xx: 重定向4xx: 客户端错误5xx: 服务器错误1xx: 信息 状态码描述100 Continue服务器仅接收到部分请求&#xff0c;但是一旦服务器并没有拒绝该请求&#xff0c;客户端应该继续发送其余的请求。101 Switching Protocols服务器转换协议&#xff1a;服…...

蓝桥杯刷题冲刺 | 倒计时15天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.年号字串2.裁纸刀3.猜生日1.年号字串 题目 链接&#xff1a; 年号字串 - 蓝桥云课 (lanqiao.c…...

【差分数组】

差分数组一维差分差分数组的作用差分矩阵结语一维差分 输入一个长度为 n 的整数序列。接下来输入 m个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加上 c &#xff0c;请你输出进行完所有操作后的序列。 输入格式 第一行包含两个…...

2022年NOC软件创意编程(学而思)决赛小学高年级组scratch

2022NOC决赛图形化小高组 一、选择题 1.运行下面的程序,最终“我的变量”的值是多少? 2.希望定义一个函数如下,可以让角色旋转指定的圈数。里面空缺的地方填上什么数字比较合适? 3.运行程序,在舞台上可以看见几个角色 ? 4.运行程序,角色会依次说什么 ? 5.我们都知…...

[JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]

目录 1.想法 2.框架的搭构 2.1图书 2.1.1Book类 2.1.2BookList类 2.2用户 2.2.1User抽象类 2.2.2AdminUser类&#xff08;管理者&#xff09; 2.2.3NormalUser 2.3操作 操作接口 借阅操作 删除操作 查询操作 归还图书 展示图书 退出系统 2.4小结 3.主函数的编…...

大数据周会-本周学习内容总结07

目录 01【hadoop】 1.1【编写集群分发脚本xsync】 1.2【集群部署规划】 1.3【Hadoop集群启停脚本】 02【HDFS】 2.1【HDFS的API操作】 03【MapReduce】 3.1【P077- WordCount案例】 3.2【P097-自定义分区案例】 历史总结 01【hadoop】 1.1【编写集群分发脚本xsync】…...

搭建一个双系统个人服务器

搭建一个双系统个人服务器0.前言一、双系统安装1.磁盘划分2.windows安装3.ubuntu安装二、系统启动项美化&#xff1a;1. refind引导2. 美化 grub 界面三、系统代理0.前言 年后找了份工作&#xff0c;忙于适应新环境所以更新也减缓了&#xff0c;最近闲暇时间给个人电脑进行了整…...

电脑长按电源键强行关机,对SSD有伤害吗?SSD 掉盘之殇

说到“按住电源键强制关机”的操作&#xff0c;想必大家都不会陌生&#xff0c;毕竟在电脑蓝屏或者电脑死机的时候&#xff0c;我们总是束手无策。而且&#xff0c;身边的人在遇到同样的情况时&#xff0c;往往都是选择长按电源键强制关机&#xff0c;所以当我们遇到同样的情况…...

Linux:centos内核优化详解

一、系统内核部分设置在以下文件 vim /etc/sysctl.conf 1.禁用IPV6 net.ipv6.conf.all.disable_ipv6 1 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.default.disable_ipv6 1 net.ipv6.conf.lo.disable_ipv6 1 # 禁用某一个指定接口的IPv6(此处为:lo) 理想情况下&#xff0c…...

链表经典OJ题合集(包含带环问题,相交问题,随机指针复制等,附动画讲解)

目录 一&#xff1a;前言 二&#xff1a;简单题目 (1)移除链表元素 (2)反转链表 (3)找链表的中间结点 (4)输入一个链表&#xff0c;输出该链表中倒数第k个结点 (5)合并两个有序链表 (6)相交链表 (7)判断链表是否带环 三&#xff1a;较难题目 (1)链表分割 (2)判断链表是否为回…...

CSS新增

系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录什么是 CSS3渐进增强和优雅降级CSS3 中的选择器CSS3 中的背景CSS3 中的边框CSS3 中的文本效果CSS3 中的字体 font-face什么是 CSS3 CSS3是CSS&#xff08;层叠样式表&#xff09;技术的升级版…...

奇安信_防火墙部署_透明桥模式

奇安信_防火墙部署_透明桥模式一、预备知识二、项目场景三、拓扑图四、基本部署配置1. 登录web控制台2.连通性配置3.可信主机配置4.授权导入5.特征库升级6.安全配置文件五、透明桥配置1. 创建桥2. 端口绑定桥3. 创建桥端口六、结语一、预备知识 安全设备接入网络部署方式 二、…...

C语言——字符串函数(2)和内存函数

(一)strtok函数dilimiters参数是个字符串&#xff0c;定义了用作分隔符的字符集合第一个参数指定一个字符串&#xff0c;它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记&#xff0c;并将其用 \0 结尾&#xff0c;返回…...

第1节 线性回归模型

1. 模型概述 对于收集到的数据(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;建立线性回归模型yiθTxiεi(1)y_i\theta^{^T} x_i \varepsilon_i (1)yi​θTxi​εi​(1) 需要估计的参数为θT\theta^{^T}θT&#xff0c;我们的目的是让估计的参数θT\theta^{^T}θT和xix_ixi​…...

CodeGeeX 130亿参数大模型的调优笔记:比FasterTransformer更快的解决方案

0x0 背景 相信大家都使用或者听说过github copilot这个高效的代码生成工具。CodeGeeX类似于github copilot&#xff0c;是由清华大学&#xff0c;北京智源研究院&#xff0c;智谱AI等机构共同开发的一个拥有130亿参数的多编程语言代码生成预训练模型。它在vscode上也提供了插件…...

Linux驱动之并发与竞争

文章目录并发与竞争的概念原子操作原子整形操作 API 函数原子位操作 API 函数自旋锁自旋锁简介自旋锁结构体自旋锁 API 函数自旋锁的注意事项读写自旋锁读写自旋锁的API顺序锁顺序锁的APIRCU(Read-Copy-Update)RCU的API信号量信号量API互斥体互斥体的API完成量(Completion)完成…...

【密码学复习】第四讲分组密码(三)

AES算法的整体结构 AES算法的轮函数 1&#xff09;字节代换&#xff08;SubByte&#xff09; 2&#xff09;行移位&#xff08;ShiftRow&#xff09; 3&#xff09;列混合&#xff08;MixColumn&#xff09; 4&#xff09;密钥加&#xff08;AddRoundKey&#xff09;1-字节代换…...

JVM(内存划分,类加载,垃圾回收)

JVMJava程序&#xff0c;是一个名字为Java 的进程&#xff0c;这个进程就是所说的“JVM”1.内存区域划分JVM会先从操作系统这里申请一块内存空间&#xff0c;在这个基础上再把这个内存空间划分为几个小的区域在一个JVM进程中&#xff0c;堆和方法区只有一份&#xff1b;栈和程序…...

工作中遇到的问题 -- 你见过哪些写的特别好的代码

strPtr : uintptr((*(*stringStruct)(unsafe.Pointer(&str))).str)代码解析&#xff1a; 这是一段 Go 代码&#xff0c;它的作用是获取一个字符串变量 str 的底层指针&#xff0c;即字符串数据的起始地址。 这段代码涉及到了 Go 语言中的指针、类型转换和内存布局等概念&…...

设计类平台网站/企业网站seo服务

Java实现的5大排序算法排序算法很多地方都会用到&#xff0c;近期又重新看了一遍算法&#xff0c;并自己简单地实现了一遍&#xff0c;特此记录下来&#xff0c;为以后复习留点材料。废话不多说&#xff0c;下面逐一看看经典的排序算法&#xff1a;1、Java排序算法之选择排序选…...

我想做网站卖衣服做/制作一个网站的费用是多少

问题描述 农田灌溉是一项十分费体力的农活&#xff0c;特别是大型的农田。蒜头君想为农民伯伯们减轻农作负担&#xff0c;最近在研究一款高科技——灌溉机器人。它可以在远程电脑控制下&#xff0c;给农田里的作物进行灌溉。现在有一片 N 行 M 列的农田。农田的土壤有两种类型&…...

沈阳网站开发培训/网络营销工程师培训

bootstrap源码分析之scrollspy&#xff08;滚动侦听&#xff09; 源码文件&#xff1a; Scrollspy.js 实现功能1、当滚动区域内设置的hashkey距离顶点到有效位置时&#xff0c;就关联设置其导航上的指定项 2、导航必须是 .nav > li > a 结构&#xff0c;并且a上href或dat…...

房建设计网站好/刷神马seo排名首页排名

使用技术&#xff1a; VuePress - Vue 驱动的静态网站生成器仓库地址&#xff1a;https://github.com/yinian-R/v... 全局安装 ## 安装 yarn global add vuepress # 或者&#xff1a;npm install -g vuepress 现有项目 如果你想在一个现有项目中使用 VuePress&#xff0c;同时想…...

重庆做网络推广的公司/seo优化关键词排名

先浅复习一下es6 let与const 作⽤域 全局作⽤域 局部作⽤域 块级作⽤域 let ⽤法&#xff1a;声明⼀个变量 特点&#xff1a; ​ 只在声明的代码块内有效 在同⼀作⽤域内不允许重复声明 没有变量提升 暂时性死区 用法&#xff1a;声明一个只读的变量(可理解为常量) …...

wordpress脚本/引流获客工具

K8S学习之CentOS7系统搭建Docker环境前言CentOS7虚拟机安装联网Docker环境部署添加普通用户执行权限安装Docker启动DockerDocker配置Docker常用命令参考链接前言 内容介绍 本次安装事先基于win10环境安装VMWare 12虚拟机&#xff0c;并创建完成CentOS7镜像&#xff0c;在以上基…...