C++基础之继承(十五)

一.继承的定义

当一个派生类继承一个基类时,需要在派生类的类派生列表中明确的指出它是从哪个基类继承而来的。类派生列表的形式如下:

class 派生类

: public/private/protected  基类

{

};

派生类生成的三个步骤:

  1. 吸收基类成员
  2. 修改基类成员
  3. 增加自己新成员

二.继承的局限

不管什么继承方式,下面这些基类特征是不能从基类继承下来的:

  1. 构造函数
  2. 析构函数
  3. 用户重载的operator new/delete运算符
  4. 用户重载的operator=运算符
  5. 友元关系

三.派生(继承)方式对基类成员的访问权限

继承方式有3种,分别是

  • public公有继承
  • protected保护性继承
  • private私有继承
继承方式基类成员访问权限在派生类中访问权限派生类(子类)对象访问
公有继承

public

protected

private

public

protected

private

可直接访问

不可直接访问

不可直接访问

保护继承

public

protected

private

protected

protected

不可直接访问

不可直接访问
私有继承

public

protected

private

private

private

不可直接访问

不可直接访问

其中在不声明继承方式时默认时private。私有继承只能被继承一代,因为在私有继承结束后所有的成员都变为私有了,也就不能在被继承了。

#include <iostream>

using std::cout;
using std::cin;
using std::endl;


class Point
{
private:
    int _ix;

public:
    int _iy;
    Point(int ix=0,int iy=0)
    :_ix(ix)
    ,_iy(iy)
    {
        cout<<"Point(int ix=0,int iy=0)"<<endl;
    }

    ~Point()
    {
        cout<<"~Point()"<<endl;
    }

    int getX() const
    {
        return _ix;
    }
};

class Point3D
:private Point
{
private:
    int _iz;

public:
    Point3D(int ix=0,int iy=0,int iz=0)
    :Point(ix,iy)
    ,_iz(iz)
    {
        cout<<"Point3D(int ix=0,int iy=0,int iz=0)"<<endl;
    }
    ~Point3D()
    {
        cout<<"~Point3D()"<<endl;
    }

    int getZ()const
    {
        return _iz;
    }

    void print() const
    {
        cout<<"ix ="<<getX()<<"iy ="<<_iy<<"iz ="<<_iz<<endl;
    }
};

class Point4D
:public Point3D
{
private:
    int _id;
public:
    Point4D(int x=0,int y=0,int z=0,int d=0)
    :Point3D(x,y,z)
    ,_id(d)
    {
        cout<<"Point4D(int x=0,int y=0,int z=0,int d=0)"<<endl;
    }

    ~Point4D()
    {
        cout<<"~Point4D()"<<endl;
    }

    void print()const
    {
        cout<<"_ix = "<<getX()<<endl<<"_iy = "<<_iy<<endl   //error
        <<"_iz = "<<getZ()<<endl<<"_id = "<<_id<<endl;
    }


};

int main()
{
    Point4D P(1,2,3,4);
    P.print();
    return 0;
}

应该将Point3D类继承Point的方式变为public/protected。

#include <iostream>

using std::cout;
using std::cin;
using std::endl;


class Point
{
private:
    int _ix;

public:
    int _iy;
    Point(int ix=0,int iy=0)
    :_ix(ix)
    ,_iy(iy)
    {
        cout<<"Point(int ix=0,int iy=0)"<<endl;
    }

    ~Point()
    {
        cout<<"~Point()"<<endl;
    }

    int getX() const
    {
        return _ix;
    }
};

class Point3D
:protected Point
{
private:
    int _iz;

public:
    Point3D(int ix=0,int iy=0,int iz=0)
    :Point(ix,iy)
    ,_iz(iz)
    {
        cout<<"Point3D(int ix=0,int iy=0,int iz=0)"<<endl;
    }
    ~Point3D()
    {
        cout<<"~Point3D()"<<endl;
    }

    int getZ()const
    {
        return _iz;
    }

    void print() const
    {
        cout<<"ix ="<<getX()<<"iy ="<<_iy<<"iz ="<<_iz<<endl;
    }
};

class Point4D
:public Point3D
{
private:
    int _id;
public:
    Point4D(int x=0,int y=0,int z=0,int d=0)
    :Point3D(x,y,z)
    ,_id(d)
    {
        cout<<"Point4D(int x=0,int y=0,int z=0,int d=0)"<<endl;
    }

    ~Point4D()
    {
        cout<<"~Point4D()"<<endl;
    }

    void print()const
    {
        cout<<"_ix = "<<getX()<<endl<<"_iy = "<<_iy<<endl   //error
        <<"_iz = "<<getZ()<<endl<<"_id = "<<_id<<endl;
    }


};

int main()
{
    Point4D P(1,2,3,4);
    P.print();
    return 0;
}

四.基类(父类)数据成员的初始化

        在创建派生类(子类)对象的时候,在调用派生类(子类)构造函数的基础上,会先调用基类(父类)的构造函数对吸收继承的成员初始化,然后在继续调用派生类(子类)的构造函数初始化。

        当创建派生类对象时,会调用派生类的构造函数,为了完成从基类吸收继承的数据成员初始化,如果在派生类初试化参数列表没有显示调用基类的构造函数编译器会自动调用基类的无参构造函数,若基类没有无参构造函数,那么程序就会报错。如果派生类需要调用有参构造函数,那么基类必须要有该构造函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复回收站被清空的文件?3个宝藏方法大公开!

“怎么办&#xff1f;不小心把回收站里的文件都清空了&#xff0c;现在没法找回我的重要数据了&#xff0c;有什么比较好的方法吗&#xff1f;快来帮帮我吧&#xff01;” 回收站作为Windows系统中的一个重要功能&#xff0c;可以帮助我们暂时存放删除的文件和文件夹&#xff0…

数据结构——树与二叉树

目录 树与二叉树 1.树的定义 2.树的有关术语 3.二叉树&#xff08;BinaryTree&#xff09; 二叉树的性质&#xff1a; 特殊的二叉树 满二叉树&#xff1a; 完全二叉树 二叉树的存储结构 顺序存储结构 链式存储结构 二叉树以及对应接口的实现 1.二叉树架构搭建 2…

PSO-CNN-BiLSTM多输入分类预测|粒子群优化算法-卷积-双向长短期神经网络分类预测|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

【Python机器学习系列】机器学习中的模型微调---随机搜索(案例+源码)

这是我的第245篇原创文章。 一、引言 如果探索的组合数量较少时&#xff0c;网格搜索是一种不错的方法&#xff0c;但当超参数的搜索范围较大时&#xff0c;通常会优先选择使用 RandomizedSearchCV 。它与 GridSearchCV 用法相似&#xff0c;但它不会尝试所有可能的组合&…

智能医疗-行业痛点

信息来源渠道少 病患只能从特定时间巡房的医护处了解病情&#xff0c;信息来源渠道少&#xff0c;了解信息内容有限。 床头卡老旧&#xff0c;信息更新不及时 每位医护人员负责的床铺数量多&#xff0c;床头卡更新频率快&#xff0c;替换纸质床头卡需打印、手写、张贴等一系列…

发展规划--IM系统

1、时代背景 5G应用&#xff0c;多终端应用&#xff0c;物联网应用&#xff0c;小程序&#xff0c;工业互联&#xff0c;大数据应用等等大前端时代的到来&#xff0c;程序员不能只关注crud&#xff0c;因为以后的服务并发量只会越来越多。 高并发架构师、大数据架构师或者说j…

ABC346 A-G 题解

ABC346 A-G题解 A题目AC Code&#xff1a;时间复杂度 B题目时间复杂度AC Code&#xff1a; C题目时间复杂度AC Code&#xff1a; D题目时间复杂度AC Code&#xff1a; E题目时间复杂度AC Code&#xff1a; F题目时间复杂度AC Code&#xff1a; G题目时间复杂度AC Code&#xff…

关于四篇GNN论文的阅读笔记PPT:包括GATNE,AM-GCN,HGSL和coGSL

关于四篇GNN论文的阅读笔记PPT&#xff1a;包括GATNE&#xff0c;AM-GCN&#xff0c;HGSL和coGSL 前言GATNEAM-GCNHGSLcoGSL 前言 这里的PPT主要是在跟Graph Transformer一起的&#xff1a; 【图-注意力笔记&#xff0c;篇章1】Graph Transformer&#xff1a;包括Graph Trans…

LeetCode每日一题——移除链表元素

移除链表元素OJ链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 这与之前的移除元素的题目很相似&#xff0c;那么我们同样可以用类似的做法&#xff08;双指针&#xff09;进行解题。但是这是一个链表删除&a…

Less-1(sqlmap手工注入攻击)--sqli

第一步&#xff1a;判断他是什么sql注入&#xff1f; 1 报错 1 and 12 -- 错误结果(--表示注释符) 1 and 11 -- 正确结果 第二步&#xff1a;判断返回字段数 ?id1 order by 3-- 正确显示结果 ?id1 order by 4--当列数为4时开始报错&#xff0c;所以只有三列 注&#xf…

基于ssm的大学生心理健康的设计与实现

1 用户功能分析 1、注册、登录系统 2、心理预约指导&#xff1a;用户登录系统可以查看心理专家&#xff0c;可以预约时间进行指导。 3、在线交流&#xff1a;可以与其他用户进行交流互动 4、个人信息&#xff1a;可以修改个人信息&#xff0c;维护自己的信息 5、心理测试&…

目标检测中的mAP计算原理和源码实现

简介 在目标检测任务中&#xff0c;mAP&#xff08;mean Average Precision&#xff0c;平均精度均值&#xff09;是一个非常重要的评价指标&#xff0c;用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率&#xff0c;能够全面反映模型在检测任务中…

VMware 调整产品方案,该跟随还是撤退?全面评估不同用户应对策略

本文针对 VMware 调整后的产品组合进行深入分析&#xff0c;并根据不同用户使用情况给出详细的应对策略&#xff0c;干货满满&#xff0c;建议收藏阅读&#xff01;重点内容包括&#xff1a; VMware 产品变化梳理不同用户如何选择应对策略&#xff1a;评估角度与应对思路梳理延…

ChatGPT 对 ELT的理解

本文主要内容来自 ChatGPT 4.0 到底什么是 ETL&#xff1f;在数据库内部&#xff0c;把数据从 ODS 层加工成 DWD&#xff0c;再加工成 DWS&#xff0c;这个过程和 ETL 的关系是什么&#xff1f;带着这些问题&#xff0c;我问了一下 ChatGPT&#xff0c;总结如下。 数据在两个数…

下载最新VMware,社区版本(免费)

VMware - Delivering a Digital Foundation For BusinessesRun any app on any cloud on any device with a digital foundation built on VMware solutions for modern apps, multi-cloud, digital workspace, security & networking.https://www.vmware.com/ 官网地址

【SpringBoot】了解简单原理 Bean管理 配置优先级

文章目录 一、配置优先级1.1 命令行设置端口号1.2 打包后修改端口号1.3 优先级 小结 二、Bean的管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 三、剖析Springboot的底层原理3.1 起步依赖3.2 自动配置3.2.1 第三方类装配3.2.2 原理分析 总结Web后端开发总结&#xff1a;源码跟…

笔记本电脑与服务器首选:PW1605可编程电流限制开关,稳定可靠新标准

一般描述 PW1605 是一款电流限制开关&#xff0c;具有可编程输入过压保护和输出电压箝位功能。集成保护 N 沟道 FET 具有极低的 RDS&#xff08;ON&#xff09; 功能&#xff0c;PW1605有助于降低正常工作期间的功率损耗。可编程软启动时间控制启动期间输出电压的压摆率。独立的…

python实现常见统计量与统计分布

一. 基本概念 1. 总体 一个统计问题研究对象的全体称为总体&#xff0c;构成总体的每个成员称为个体。 2. 样本 一般由于总体的数量是非常巨大的&#xff0c;不可能对全部总体进行研究&#xff0c;通常会对总体进行抽样进行研究。 从总体中按一定规则抽出的一部分个体称为…

UE4_官方动画内容示例1.2_动画蓝图——使用蓝图告知Actor播放动画

展示了两个示例&#xff1a;在其中一个示例中&#xff0c;使用蓝图告知Actor播放动画&#xff0c;在另外一个示例中&#xff0c;展示了告知Actor播放动画的动画蓝图&#xff08;例如&#xff0c;此示例展示了如何将变量从蓝图传递给动画蓝图&#xff0c;并演示了如何将现有姿势…

.NET高级面试指南专题二十三【 B+ 树作为索引有什么优势】

B 树作为索引有许多优势&#xff0c;这些优势使其成为许多数据库管理系统中首选的索引结构之一。以下是 B 树作为索引的一些主要优势&#xff1a; 高效的查询性能&#xff1a;B 树是一种平衡树结构&#xff0c;具有良好的平衡性和高度平衡的性质&#xff0c;这使得在 B 树上进行…