cpp学习记录05:类和对象02

news2025/1/12 8:08:41

继承

面向对象的语法思想都差不多继承的好处就是方便

语法: class 子类 : 继承方式 父类

继承方式

公共继承:继承的内容权限不变

保护继承:继承的内容权限变为protected

私有继承:继承的内容权限变为private

这三类继承都不可访问父类中private的内容(还是被继承了)

继承中构造和析构顺序

先构造父类,再构造子类,析构顺序与构造顺序相反。

继承同名成员处理方式

访问子类同名成员 直接访问即可

访问父类同名成员 需要加作用域

class base {
public:
    int a=100;
};
class son:public base {
public:
    int a=200;
};
void test() {
    son s;
    cout<<s.a<<endl; //200
    cout<<s.base::a<<endl; //100 加作用域调用父类同名成员
}

当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数

多继承

C++中允许一个类继承多个类,这点和Java不一样

语法:class 子类::继承方式 父类1 , 继承方式 父类2...

多继承可能引发父类中有同名成员的出现,需要加作用域区分.实际开发中不建议使用

class Base1 {
public:
    Base1() {
        m_A = 100;
    }
    int m_A;
};
class Base2 {
public:
    Base2() {
        m_B = 100;
    }
    int m_B;
};

class Son :public Base1,public Base2 {
public:
    Son() {
        m_C = 300;
        m_D = 400;
    }
    int m_C;
    int m_D;
};

void test1() {
    Son s;
    cout<<sizeof(s)<<endl; //16 4个int
}

虚继承

在继承之前加上关键字virtual

。。。。

多态

多态分为两类:

静态多态:函数重载和运算符重载

动态多态:派生类和虚函数实现运行时多态

两者区别

静态多态的函数地址早绑定 - 编译阶段确定函数地址

动态堕胎的函数地址晚绑定 - 运行阶段确定函数地址

class Animal {
public:
    void speak() {
        cout<<"11"<<endl;
    }
};
class Cat:public Animal {
public:
    void speak() {
        cout<<"22"<<endl;
    }
};
void doSpeak(Animal &animal) {
    //执行的是animal的speak 原因是地址早绑定 在编译阶段就已确定
    animal.speak(); //11
}
void test01() {
    Cat cat;
    doSpeak(cat); //11
}

动态多态满足条件

1.要有继承关系

2.子类重写父类中的虚函数

动态多态使用

父类的指针或者引用 执行子类对象

class Animal {
public:
    //虚函数
    virtual void speak() {
        cout<<"11"<<endl;
    }
};
class Cat:public Animal {
public:
    void speak() {
        cout<<"22"<<endl;
    }
};
void doSpeak(Animal &animal) {
    //如果想执行猫说话就需要晚绑定通过将animal中的speak函数变为虚函数来实现
    animal.speak(); //22
}

纯虚函数

通常父类中的虚函数的实现是毫无意义的,主要是调用子类重写的内容

因此可将虚函数改为纯虚函数

纯虚函数语法:virtual 返回值类型 函数名 (参数列表)=0

重写纯虚函数时 也需要加上virtual

抽象类

当类中有了纯虚函数,这个类就是抽象类

特点

(和Java差不多)

无法实例化对象

子类必须重写抽象类中的纯虚函数,否则也属于抽象类

虚析构和纯虚析构

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

class Animal {
public:
    //虚函数
    virtual void speak() = 0;
};
class Cat:public Animal {
public:
    Cat(string name) {
        this->name = new string(name);
    }
    virtual void speak() {
        cout<<"22"<<endl;
    }
    ~Cat() {
        if(name!=NULL) {
            cout<<"cat析构"<<endl;
            delete name;
            name = NULL;
        }
    }
    string * name;
};
void doSpeak(Animal &animal) {
    //执行的是animal的speak 原因是地址早绑定 在编译阶段就已确定
    animal.speak(); //11
    //如果想执行猫说话就需要晚绑定通过将animal中的speak函数变为虚函数来实现
    animal.speak();
}
void test() {
    Animal * a = new Cat("Tom");
    a ->speak();
    delete a;   //Cat的析构函数没有触发
    //问题:delete父类指针时 不会调用子类的析构 导致子类堆区会有泄露的情况
}

解决方式:将父类中的析构函数改为虚析构或者纯虚析构

虚析构

class Animal {
public:
    //虚函数
    virtual void speak() = 0;

    //虚析构
    virtual ~Animal() {
        cout<<"xuxigou"<<endl;
    };
};

纯虚析构

class Animal {
public:
    //虚函数
    virtual void speak() = 0;
    
    //纯虚析构
    virtual ~Animal() = 0;
};
//纯虚析构要有声明也要有实现
Animal:: ~Animal() {
   cout<<"纯虚析构"<<endl;
};

两者共性:

可以解决父类指针释放子类对象

都需要具体函数实现

区别:

如果是纯虚析构,该类属于抽象类,无法实例化对象

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

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

相关文章

1000W长连接,如何建立和维护?千万用户IM 架构设计

1000W长连接&#xff0c;如何建立和维护&#xff1f;千万用户IM 架构设计 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类…

哈夫曼树及哈夫曼编码

目录 一. 前言 二. 哈夫曼树的构造 三. 哈夫曼编码 一. 前言 在学习哈夫曼树之前&#xff0c;我们先了解几个基本概念。 1.路径&#xff1a;从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。 2.结点的路径长度&#xff1a;两结点间路径上的分支数。 3.树的…

Visual Studio 2022 安装步骤

一、官方下载 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 下载完成&#xff0c;得到VisualStudioSetup.exe文件 二、安装 Visual Studio 2022 由于我有 Professional 版本的密钥&#xff0c;因此安装Professional 版本。 Visual Studio 2022 Profes…

libtorch学习历程(一):libtorch2.4.0+opencv4.10+Qt6安装

开发环境 Win11RTX4060CUDA12.1libtorch 2.4.0 ,CUDA12.1,release版VS2022opencv4.10版本Qt 6.6.3 软件下载 libtorch下载 直接去pytorch官网下载即可&#xff0c;根据需要下载realease与debug版。 而CUDA的版本则查看CUDA版本教程&#xff0c;来选择合适的。 debug版与r…

大数据核心概念与技术架构简介

大数据基本概念 大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据特征&#xff1a; 数据量大&#xff1a;一般以P&#xff08;1000个TB&a…

详解DDR3原理以及使用Xilinx MIG IP核(app 接口)实现DDR3读写测试

系列文章目录 &#xff08;1&#xff09;详解SDRAM基本原理以及FPGA实现读写控制 文章目录 系列文章目录一、DDR简介1.1 什么是 SDRAM、DDR、DDR2、DDR31.2 SDRAM、DDR、DDR2、DDR3核心频率、工作频率以及等效频率的计算1.3 DDR3带宽以及容量的计算 二、MIG IP核的介绍三、MIG…

Datawhale AI夏令营第三期 AI+物质科学学习记录 Task2 RNN建模SMILES进行反应产率预测

引导 如何将化学知识转化为计算机可识别的形式 提到化学应该会想到元素周期表&#xff0c;分子式&#xff0c;化学反应方程等等&#xff0c;化学这门学科的知识和内容都有专有符号记录的&#xff0c;但计算机不能理解&#xff0c;所以需要将这些符号让计算机能理解 Ai4Chemi…

python orm框架有哪些

ORM概念 ORM&#xff08;Object Ralational Mapping&#xff0c;对象关系映射&#xff09;用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样&#xff0c;我们在具体的操作实体对象的时候&#xff0c;就不需要再去和复杂的SQL语句打交道&#xff0c;只需简…

5 postgresql 并行查询

并行扫描会占用更多的cpu/IO内存资源&#xff0c;开启的时候要小心配置。 大部分场景都能提高查询效率 之前有过一个生产案例&#xff0c;开启并行之后性能反而没有普通的好&#xff0c;原因就是占有了太多资源&#xff0c;查询慢了&#xff0c;增加表锁概率&#xff0c;产生…

ISO 14001:引领企业绿色革命的环境管理体系

ISO 14001 以其预防为主、系统化管理的特点&#xff0c;在众多管理体系中脱颖而出。该标准强调通过识别和控制环境因素&#xff0c;提前预防潜在环境问题&#xff0c;从根本上减少企业对环境的负面影响。这种预防性管理模式&#xff0c;不仅能够有效保护环境&#xff0c;还能降…

.[datastore@cyberfear.com].mkp勒索病毒数据怎么处理|数据解密恢复

引言 近年来&#xff0c;网络安全威胁日益严峻&#xff0c;其中勒索病毒成为了一种极具破坏性的恶意软件。特别是[conkichinmodlconkichinmodl.com].mkp 、[datastorecyberfear.com].mkp勒索病毒&#xff0c;其通过加密用户文件并索取赎金的方式&#xff0c;给受害者带来了巨大…

15.列表框文本域和文件域

一、列表框 <!-- 下拉框&#xff0c;列表框 --><p>城市&#xff1a;<select name"城市"><option value"Guangzhou">广州</option><option value"Shenzhen" selected>深圳</option><option value&…

Zabbix 7.0 安装

在zabbix官网中有着比较完善的安装步骤&#xff0c;针对不同的系统都有。可以直接按照举例说明进行安装。本文只是针对其提供的安装步骤进行一些说明解释补充。 安装环境 操作系统版本&#xff1a;AlmaLinux 9.4&#xff08;10.10.20.200&#xff09;zabbix版本&#xff1a;7.…

A股震荡前行,3000点指日可待?

今天的A股&#xff0c;让人瞬间呆住了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股小幅洗盘&#xff0c;涨了一天就熄火了&#xff1f;让人瞬间呆住了。不慌&#xff01;敢于回踩&#xff0c;才能更…

两个好消息,你先听哪个?

1.第五大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024)成功申请IEEE出版&#xff0c;上线IEEE官网&#xff0c;欢迎投稿参会&#xff01;&#xff01;&#xff01; &#x1f4e3;IEEE独立出版&#xff0c;设置优秀评选 &#x1f525;院士加盟&#xff0c;中外高…

C嘎嘎浅聊string

那么这篇文章我们开始学习 c嘎嘎的string stl简介 什么是stl STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的 组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架 stl版本 原始版本、P.J.版本、RW版…

机械学习—零基础学习日志(高数18——无穷小与无穷小)

零基础为了学人工智能&#xff0c;真的开始复习高数 学习速度加快&#xff01; 无穷小定义 这里可以记住&#xff0c;无穷小有一个特殊&#xff0c;那就是零。 零是最高阶的无穷小&#xff0c;且零是唯一一个常数无穷小。 张宇老师还是使用了超实数概念来讲解无穷小。其实是…

在云服务器上自动化部署项目,jenkins和gitee

▮全文概述 在编写项目时&#xff0c;很头大的事情就是需要自己手动的上传jar包到服务器上启动。如果出现一点bug&#xff0c;就要重头上传和启动。这是一件很烦的事情&#xff0c;所以&#xff0c;可以使用jenkins和gitee实现项目的自动部署 ▮全流程 在本地提交代码到gitee …

kvm+glusterfs+pcs分布式存储构建kvm高可用群集。

kvmglusterfspcs分布式存储构建kvm高可用群集。 高可用指能在短时间内自动完成故障转移&#xff0c;kvm在实现故障自动转移的方式如果要考虑速度那么基于共享存储的迁移方法无疑是最快的。而共享存储的高可用就可以用glusterfs来实现。 glusterfs可以利用分布式复制卷兼顾了性能…

图解RocketMQ之消费者如何进行消息重试

大家好&#xff0c;我是苍何。 在上一篇[[图解RocketMQ之生产者如何进行消息重试]]中分析了当生产者发送消息失败的时候&#xff0c;RocketMQ 是如何进行重试的。 最后留了一个问题&#xff0c;生产端的消息是重试 hold 住了&#xff0c;但如果消费者出现异常&#xff0c;消费…