c++指南 继承和多态

继承和多态

继承的概念

继承是面向对象编程的一个重要特性,它允许新创建的类(称为子类或派生类)继承现有类(称为基类或父类)的属性和方法。

基类与子类

基类:提供了可以被继承的属性和方法。
子类:继承了基类的属性和方法,并且可以添加新的属性和方法或重写继承的方法。

继承的类型

公有继承(public):子类继承基类的公有成员和保护成员,并且它们在子类中也是公有或保护的。
私有继承(private):子类继承基类的公有和保护成员,但它们在子类中变为私有的。
保护继承(protected):子类继承基类的公有和保护成员,但它们在子类中变为保护的。

多态性

多态性是对象可以有多种形式的能力。在C++中,多态性主要通过虚函数实现。

虚函数

虚函数是基类中的函数,允许在派生类中被重写(Override)。使用 virtual 关键字声明。

class Base {
public:virtual void show() { std::cout << "Base show" << std::endl; }
};class Derived : public Base {
public:void show() override { std::cout << "Derived show" << std::endl; }
};

抽象类

抽象类是不能被实例化的类,它至少包含一个纯虚函数。使用 = 0 来定义纯虚函数。

class AbstractBase {
public:virtual void pureVirtualFunc() = 0; // 纯虚函数
};class ConcreteClass : public AbstractBase {
public:void pureVirtualFunc() override {// 实现抽象类中的纯虚函数}
};

多态的实现

使用基类指针或引用指向派生类对象,可以实现动态多态性。

Base* basePtr = new Derived();
basePtr->show(); // 输出 "Derived show",展示了多态性
delete basePtr;

虚析构函数

在C++中,如果一个类是多态基类(即有一个或多个虚函数),则其析构函数应当被声明为虚函数。这是因为当通过基类指针删除派生类对象时,需要确保正确地调用派生类的析构函数,然后才是基类的析构函数。

class Base {
public:virtual ~Base() {std::cout << "Base destructor" << std::endl;}
};class Derived : public Base {
public:~Derived() {std::cout << "Derived destructor" << std::endl;}
};int main() {Base* basePtr = new Derived();delete basePtr; // 正确地调用Derived和Base的析构函数return 0;
}
输出为
Derived destructor
Base destructor

运算符重载与多态

运算符重载允许你定义类的运算符如何工作。当运算符被重载为成员函数时,它可以是虚函数,从而支持多态性。

例子

  1. 使用虚函数重载 == 运算符
class Base {
public:virtual bool operator==(const Base& other) const {// 默认实现,可能需要根据实际需求重写return this == &other;}
};class Derived : public Base {int value;
public:Derived(int v) : value(v) {}bool operator==(const Base& other) const override {// 重写 == 运算符以比较 Derived 对象const Derived* otherDerived = dynamic_cast<const Derived*>(&other);if (otherDerived) {return value == otherDerived->value;}return false;}
};
  1. 重载输出流运算符 <<
class Person {std::string name;
public:Person(const std::string& n) : name(n) {}friend std::ostream& operator<<(std::ostream& os, const Person& p) {os << "Person: " << p.name;return os;}
};class Employee : public Person {int id;
public:Employee(const std::string& n, int i) : Person(n), id(i) {}friend std::ostream& operator<<(std::ostream& os, const Employee& e) {os << static_cast<const Person&>(e); // 调用基类的输出os << ", ID: " << e.id;return os;}
};

在这个例子中,Employee 类重载了 << 运算符,输出 Employee 对象时,首先调用了基类 Person 的 << 运算符,然后添加了 Employee 特有的信息。

  1. 重载赋值运算符 =
class Data {int* array;size_t size;
public:Data(size_t s) : size(s), array(new int[s]) {}Data(const Data& other) : size(other.size), array(new int[other.size]) {std::copy(other.array, other.array + size, array);}Data& operator=(const Data& other) {if (this != &other) {delete[] array;size = other.size;array = new int[size];std::copy(other.array, other.array + size, array);}return *this;}~Data() {delete[] array;}
};

在这个例子中,赋值运算符 = 被重载以确保深拷贝数组,并且正确地处理自赋值的情况。

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

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

相关文章

shellcode汇编复习

shellcode汇编复习 一、 汇编代码复习1.1 基础寄存器1. EAX (Accumulator Register)2. EBX (Base Register)3. ECX (Count Register)4. EDX (Data Register)5. ESI (Source Index Register)6. EDI (Destination Index Register) 二、 基础指令1. mov - 数据传送2. add - 加法3.…

JAVA IO之基础知识

简介 IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因此称为 IO 流。IO 流在 Java…

Ansys Zemax|如何有效地模拟散射

附件下载 联系工作人员获取附件 概要 OpticStudio中&#xff0c;有两个用来提升散射模拟效率的工具&#xff1a;Scatter To List以及Importance Sampling。在这篇文章中&#xff0c;我们详细讨论了这两个工具&#xff0c;并且以一个杂散光分析为例示范了如何使用Importance S…

Shell工具——cut

cut 是一个用于在 Unix 和 Linux 系统中提取文本行中特定部分的命令行工具。它通常用于从文件或命令输出中提取列、字段或字符&#xff0c;特别是在处理由分隔符分割的文本数据时&#xff08;例如CSV文件&#xff09;。 基本语法 cut OPTION [FILE...]其中&#xff0c;OPTION…

机器学习调优方法总结

目录 一、问题 问题1&#xff1a;数据输入 问题2&#xff1a;output和target维度不匹配 问题3&#xff1a;NLP中处理数据有哪些方法&#xff1f; 二、改进 改进1&#xff1a;改变归一化函数 改进1.1&#xff1a;用StandardScaler替换MinMaxScale 改进1.2&#xff1a;数…

简单的jar包重打包Failed to get nested archive for entry 报错处理

简单的jar包重打包Failed to get nested archive for entry 报错处理 1. 需求 公司有一个后端项目&#xff0c;项目已经打好了jar包&#xff0c;现在我们发现jar包依赖的子包有问题&#xff0c;其中的一个mybatis xml文件查询数据不正确&#xff0c;我们需要替换项目&#xf…

批量将labelme的json文件转为png图片查看

文章目录 前提修改 l a b e l m e labelme labelme然后你就可以在这个环境下用代码批量修改了 前提 安装anaconda或者miniconda安装labelme 修改 l a b e l m e labelme labelme 查看labelme所处环境的路径&#xff1a;conda info --envs 比如我的是在py39_torch里面 修改la…

秋招力扣Hot100刷题总结——链表

1. 反转链表题目连接 题目要求&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 代码及思路 遍历所有节点&#xff0c;将所有节点的next指向前一个节点由于要改变节点的next指向&#xff0c;而链表是单向的&#xff0c;因此需要…

Radiance Field Learners As UAVFirst-Person Viewers 翻译

作为无人机第一人称视角的辐射场学习者 引言。第一人称视角&#xff08;FPV&#xff09;在无人机飞行轨迹的革新方面具有巨大的潜力&#xff0c;为复杂建筑结构的导航提供了一条令人振奋的途径。然而&#xff0c;传统的神经辐射场&#xff08;NeRF&#xff09;方法面临着诸如每…

PyQt5 QSS

一、 二、 三、课堂练习 1.课时122.QSS基础_哔哩哔哩_bilibili import sys, os from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtPrintSupport import QPrinter,QPageSetup…

【Mac】植物大战僵尸杂交版 for Mac(经典策略塔防游戏)游戏介绍

游戏介绍 植物大战僵尸杂交版 for Mac是一款非常受欢迎的策略塔防游戏&#xff0c;植物大战僵尸游戏以其独特的主题、幽默的风格和富有挑战性的关卡设计而著称。玩家需要种植各种植物来防御入侵的僵尸&#xff0c;每种植物都有其特定的功能和攻击方式。植物大战僵尸杂交版&…

Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件&#xff0c;然后发送广播事件 Android12类路径&#xff1a; frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…

SQL注入(head、报错、盲注)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 1. 报错注入 1.1 那么什么是报错注入呢&#xff1f; 1.2 报错注入原理 extractvalue函数 updatexml函数 1.3 靶场解析 靶场练习 2. HEAD注入 2.1 相关全局变量 2.2 靶场解析 burp暴力破解 靶场练习 3…

PostgreSQL的pg_dump中 --inserts参数测试

PostgreSQL的pg_dump中 --inserts参数测试 1 准备测试数据 创建表yewu1.t1&#xff0c;并插入1000000条数据。 white# create table yewu1.t1 (id int,name varchar(20)); CREATE TABLE white# DO $$ white$# DECLARE aa INTEGER; white$# BEGIN white$# FOR aa IN 1..1…

java常见面试题汇总

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明一、封装 继承 多态1.封装2.继承3.多态 二、什么是重载…

初始化列表 / 隐式转换 / 静态

目录 初始化列表隐式转换单参数的隐式类型转换多参数的隐式类型转换explicit关键字 static 初始化列表 大部分时候成员变量在对象实例化的时候调用构造函数就整体定义了&#xff0c;注意此时只有定义&#xff0c;不算初始化。而定义后的值的值是在构造函数里面给的。我们知道构…

Java并发编程(20)—— ConcurrentHashMap详解

ConcurrentHashMap是Java并发很重要的组件,也是大厂面试经常考察的对象,下面我就全面来详解ConcurrentHashMap 1. ConcurrentHashMap ConcurrentHashMap是Java集合框架中的一个线程安全的哈希表实现,它支持高效地并发访问和修改操作。 我们知道HashMap是线程不安全的,在多线…

DataWorks函数

文章目录 0、MaxCompute预置的函数分类1、日期函数2、数学函数3、算术运算符4、窗口函数5、聚合函数6、字符串函数7、复杂类型函数8、加密函数9、其他函数 0、MaxCompute预置的函数分类 函数类型说明日期函数支持处理DATE、DATETIME、TIMESTAMP等日期类型数据&#xff0c;实现…

oracle liunx 常用命令

前言 Oracle Linux 是一个企业级的 Linux 发行版&#xff0c;基于 Red Hat Enterprise Linux (RHEL)。在 Oracle Linux 上使用常用的 Linux 命令来管理系统和数据库是很普遍的。以下是一些常用的 Oracle Linux 命令和它们的功能说明&#xff1a; 1. 文件和目录管理 ls&#…

<数据集>无人机航拍不同高度牧羊识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;6065张 标注数量(xml文件个数)&#xff1a;6065 标注数量(txt文件个数)&#xff1a;6065 标注类别数&#xff1a;1 标注类别名称&#xff1a;[sheep] 序号类别名称图片数框数1sheep6065149785 使用标注工具&…