掘根宝典之C++抽象基类,protected,纯虚函数

关键字protected

关键字protected和private相似,在类外只能用公有类成员来访问protected部分的成员。

#include<iostream>
using namespace std;
class AA
{
protected:int a_;
public:AA(int a):a_(a){}void A(){cout << a_ << endl;}
};
int main()
{AA r(2);r.a_ = 3;//这是不行的r.A();//结果是2
}

private和protected的区别只有在基类派生出的类里才会体现出来。派生类的成员可以直接访问基类的保护成员,但是不能直接访问基类的私有成员。因此对于外部世界来说,保护成员的行为与私有成员类似;但对于派生类来说,保护成员的行为和公有成员类似

protected:

#include<iostream>
using namespace std;
class AA
{
protected:int a_;
public:AA(int a):a_(a){}void A(){cout << a_ << endl;}
};
class BB :public AA
{
protected:int b_;
public:BB(int a,int b):AA(a),b_(b){}void A(){cout << a_ << endl;///可以直接访问基类的protected}
};
int main()
{BB r(2,3);r.A();
}

 private:

#include<iostream>
using namespace std;
class AA
{
private:int a_;
public:AA(int a):a_(a){}void A(){cout << a_ << endl;}
};
class BB :public AA
{
protected:int b_;
public:BB(int a,int b):AA(a),b_(b){}void A(){cout << a_ << endl;//不可以直接访问基类的private}
};
int main()
{BB r(2,3);r.A();
}

惯例:我们通常将数据成员设置为private,把部分类方法设置为protected

纯虚函数

不懂虚函数的看这里http://t.csdnimg.cn/qgl94

在C++中,纯虚函数(Pure Virtual Function)是一种在基类中声明但没有实现的虚函数。纯虚函数的声明形式为在纯虚函数声明后面加上= 0,表示该函数没有具体的实现。

在类声明中包含纯虚函数时,不能创建该类的对象(包含纯虚函数的类只能作基类)

纯虚函数的主要作用是为了定义一个接口,在基类中声明纯虚函数后,派生类必须实现这个函数,否则派生类也会成为抽象类。纯虚函数使得基类能够定义一些通用的接口或行为,而将具体的实现交给派生类来完成。

下面是一个示例代码:

class Shape {
public:virtual double area() const = 0;  // 纯虚函数
};class Rectangle : public Shape {
public:double area() const {// 实现具体的计算逻辑return length * width;}
private:double length;double width;
};class Circle : public Shape {
public:double area() const {// 实现具体的计算逻辑return 3.14159 * radius * radius;}
private:double radius;
};

在上述代码中,Shape是一个抽象基类,它包含一个纯虚函数area()RectangleCircleShape的派生类,它们必须实现area()函数。

纯虚函数只提供了一个函数的声明,没有具体的实现。因此,不能直接实例化一个包含纯虚函数的类对象,只能通过派生类来使用。对于包含纯虚函数的类来说,它们被称为抽象类,不能创建对象实例。只有派生类实现了所有纯虚函数,才能创建对象实例。

抽象基类

在C++中,抽象基类(Abstract Base Class)是一种特殊的类,它只用于作为其他类的基类,而不能直接实例化对象。抽象基类的主要目的是定义一个通用的接口,而不关心具体的实现细节

抽象基类通常包含纯虚函数(Pure Virtual Function),这是一种没有实际实现的函数,在抽象基类中只是声明而没有定义。子类必须实现这些纯虚函数,否则子类也会成为抽象类。例如:

class Shape {
public:virtual double area() const = 0;  // 纯虚函数
};class Rectangle : public Shape {
public:double area() const {// 实现具体的计算逻辑return length * width;}
private:double length;double width;
};class Circle : public Shape {
public:double area() const {// 实现具体的计算逻辑return 3.14159 * radius * radius;}
private:double radius;
};

在上述例子中,Shape是一个抽象基类,它包含一个纯虚函数area(),子类RectangleCircle都需要实现这个函数。当我们使用抽象基类的指针或引用时,可以通过动态绑定的方式调用子类的实现。

Shape* shape;
Rectangle rect;
Circle circle;shape = ▭
double rectArea = shape->area();  // 调用Rectangle的area函数shape = &circle;
double circleArea = shape->area();  // 调用Circle的area函数

抽象基类的使用可以提供一种接口的统一标准,使得不同的子类能够以相同的方式进行使用和处理。

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

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

相关文章

Rust 数据结构与算法:4栈:用栈实现进制转换

2、进展转换 将十进制数转换为二进制表示形式的最简单方法是“除二法”&#xff0c;可用栈来跟踪二进制结果。 除二法 下面实现一个将十进制数转换为二进制或十六进制的算法&#xff0c;代码如下&#xff1a; #[derive(Debug)] struct Stack<T> {size: usize, // 栈大…

蓝桥杯每日一题----单调栈和单调队列

单调栈和单调队列 单调栈 单调栈即栈内的元素是单调递减或者单调递增的&#xff0c;我们通过一个题目来理解。 单调栈模板题 题目描述 给出项数为 n 的整数数列 a 1 … a n a_1…a_n a1​…an​。 定义函数 f ( i ) f(i) f(i)代表数列中第 i 个元素之后第一个大于 a i …

相机—特点及区别

1.相机种类 RGB&#xff0c;RGB-D&#xff0c;单目&#xff0c;双目&#xff0c;sterro相机&#xff0c;实例相机 2.相机特点 2.1单目 只使用一个摄像头进行SLAM&#xff0c;结构简单&#xff0c;成本低 三维空间的二维投影 必须移动相机&#xff0c;才能估计场景中物体的…

Redis面试题整理(持续更新)

1. 缓存穿透&#xff1f; 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到 DB 去查询&#xff0c;可能导致DB挂掉&#xff0c;这种情况大概率是遭到了攻击。 解决方案&#xff1a; …

python-分享篇-自定义词云图颜色

文章目录 准备代码效果 准备 运行本程序需要安装第三方模块matplotlib、jieba、wordcloud 和scipy &#xff0c;scipy要求1.0.0版本&#xff0c;否则程序将出现导入错误&#xff1a;ImportError: cannot import name ‘imread’ from ‘scipy.misc’ ImportError: cannot impo…

Linux下的自动化任务与计划任务:让你的系统更智能

在日常的Linux系统管理中&#xff0c;你是否经常需要定时执行某些任务&#xff0c;或者希望在系统启动时自动运行某些脚本&#xff1f;如果是的话&#xff0c;那么自动化任务和计划任务将是你的得力助手。它们可以帮助你提高系统效率、减少人工干预&#xff0c;并确保任务能够按…

备战蓝桥杯---图论之最短路Floyd算法

过去我们一直在求单源最短路&#xff0c;今天让我们看一下多源最短路的求法。 我们介绍一下它的核心思想&#xff1a;即不断在原有基础上添加新的中转点并求出此时的最优状态&#xff0c;是一种动态规划思想的体现。 具体流程&#xff1a; 我们先列出无中转点&#xff08;也…

蓝桥杯(Web大学组)2023省赛真题:视频弹幕

思路&#xff1a; 主要是要仔细阅读题目以及理解给出的已有代码&#xff0c;进行函数间的调用、定时器的使用、元素移除、清除定时器等&#xff0c;注意细节。 笔记&#xff1a; height不要写成hight设置left时,记得加单位px可以获取left的值进行计算&#xff0c;但要注意sp…

【汇编】简单的linux汇编语言程序

一、Linux系统汇编语言 Linux系统上的汇编语言可以使用不同的语法风格&#xff0c;主要包括Intel语法和AT&T语法。这两种语法有各自的特点和风格区别&#xff0c;尽管它们表示的底层机器指令相同。下面分别对两种语法进行简要说明&#xff1a; Intel语法 Intel语法是由I…

有啥办法把百度地图某个点1公里范围内截个图?

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 东方欲晓&#xff0c;莫道君行早。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银交流群【上海新年人】问了一个地图截图的问题&#xff…

513. 找树左下角的值

513. 找树左下角的值 题目链接&#xff1a;513. 找树左下角的值 代码如下&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {…

找不到目标和方向,怎么办?

现代社会里&#xff0c;许多人常见的症状&#xff0c;就是「空心病」。 什么是空心病呢&#xff1f;类似这样&#xff1a; 我知道要有目标&#xff0c;但我就是不知道想做什么&#xff0c;感觉对一切事物都提不起兴趣&#xff0c;没有动力&#xff0c;怎么办&#xff1f; 这个…

【C语言】socketpair 的系统调用

一、 Linux 内核 4.19socketpair 的系统调用 SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,int __user *, usockvec) {return __sys_socketpair(family, type, protocol, usockvec); } 这段代码定义了一个名为 socketpair 的系统调用。系统调用是操作…

Optional对空值的处理

文章目录 前言一、上代码1. isPresent2. ifPresent3. map4. orElse5. orElseGet6. orElseThrow7. optional 总结 前言 Java中最常见的异常就是NullPointerException,空指针的出现不应该影响业务的正常执行,我们应该尽量避免,把异常控制在编码阶段,jdk8为我们提供了Optional&am…

AI算法参数个数本身优化空间

一、背景 AI算法的参数数量并非越多越好&#xff0c;也不是越少越好。参数的数量与模型的复杂度密切相关&#xff1a; 1. 参数多&#xff08;高复杂度模型&#xff09;&#xff1a; - 优点&#xff1a;模型具有更强的表达能力和拟合能力&#xff0c;对于复杂的、非线性的数据分…

C 语言 devc++ 使用 winsock 实现 windows UDP 局域网发送消息

U参考来源 U 这里移植到windows 上 &#xff0c;使用 devc 开发。 服务端代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <winsock2.h>int main() {WORD sockVersion MAKEWORD(2, 2);WSAD…

15.2 OpenGL可编程片段处理:着色器执行

着色器执行 Shader Execution 在片段阶段存在活动的程序对象时&#xff0c;该程序对象的可执行代码用于处理由光栅化产生的传入片段。 实现允许跳过对某些片段着色器调用的执行&#xff0c;并且由于实现相关原因&#xff08;包括在片段着色器阶段不存在活动的程序对象时&…

微服务多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存…

python-自动化篇-办公-Excel-Openpyxl库

文章目录 1.1 Openpyxl库的安装使用1.2 Excel的新建、读取、保存1.2.1新建保存工作簿1.2.2读取保存工作簿1.2.3实例(批量建新工作表) 1.3工作表对象的获取方法1.3.1工作表获取方式1.3.2实例(批量修改工作表名) 1.4工作表的新建、复制、删除1.4.1新建工作表1.4.2复制工作表1.4.3…

MATLAB实现朴素贝叶斯分类

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的分类算法&#xff0c;它假设特征之间相互独立&#xff0c;从而简化了计算复杂性。该算法常用于文本分类、垃圾邮件过滤、情感分析等应用场景。 MATLAB实现鸢尾花数据集分类代码如下&#xff1a; clear lo…