C++基类与派生类

news2024/12/28 10:54:09

1.派生类的定义

        派生类语法如下:


class <派生类名> : <继承方式> <基类名>
{
private:
	派生类新增成员;
protected:
	派生类新增成员;
public:
	派生类新增成员;
};

说明:
(1)class:类声明的关键字;
(2)派生类名:新(派生)类名;
(3)继承方式:指出继承的方式是什么。继承方式包含以下3种。
• public(公有继承方式)使用的最多;
• private(私有继承方式);
• protected(保护继承方式)。
用来说明对于从基类继承来的成员的访问权限,这个稍后介绍。

如果不写继承方式,则默认为 private(私有继承方式)。

(4)基类名:指明派生类是由哪个基类继承而来的。
(5)派生类的成员包括如下3种。
• 吸收基类成员:派生类继承了基类的除了构造函数和析构函数以外的全部数据成员和函数成员。
• 新增成员:增添新的数据成员和函数成员,体现了派生类与基类的不同和个性,是派生类对基类的发展。
• 对基类成员进行改造,包含两层含义:一是对基类成员的访问控制方式进行改造;二是定义与基类同名的成员,即同名覆盖。


class A
{
private:
	int m_a;
protected:
	int m_b;
public:
	int m_c;
};

class B :public A //B是A的派生类
{
private:
	int m_d;
};

int main()
{
    cout << "A的大小=" << sizeof(A) << ",B的大小=" << sizeof(B) << endl;

    return 0;
}

程序执行结果如下:

1.png

B的大小为16,说明它把A中的3个成员变量全部继承了。
下面的代码把继承方式由public改为private


class A
{
private:
	int m_a;
protected:
	int m_b;
public:
	int m_c;
};

class B :private A //B是A的派生类,继承方式改为private
{
private:
	int m_d;
};

int main()
{
    cout << "private继承" << endl;
    cout << "A的大小=" << sizeof(A) << ",B的大小=" << sizeof(B) << endl;

    return 0;
}

程序执行结果如下:

1.png

说明:

基类的所有数据成员都被派生类继承,和基类成员的访问权限无关及继承方式无关。(m_a,m_b,m_c)的访问权限不同

B类的内存图如下:

1.png


class Base//基类
{
public:
    void show()
    {
        cout << m_name << "," << m_a << endl;
    }
public:
    string m_name; //名字
    int m_a; //值
};

class Derived :public Base //派生类继承了基类的成员
{
//什么都没有增加
};

int main()
{
    Derived d;
    d.m_a = 10;
    d.m_name = "派生类";
    d.show();

    return 0;
}

1.png

从上面的执行结果可以看出,派生类虽然什么都没有写,但它继承了基类的成员数据(m_a和m_name)和成员函数(show)。

2. 继承方式和派生类的访问权限

派生类继承了基类的数据成员和成员函数,但是这些成员并不都能直接被派生类所访问。采用不同的继承方式,决定了基类成员在派生类中的访问权限。

在C++程序设计中,提供了3种继承方式:公有继承(public)、保护继承(protected)和私有继承(private)。访问权限public > protected > private 。下表为不同继承方式下,派生类对于从基类继承的成员的访问权限。
注意:protected不能在类外访问,它和private的区别是在继承时有区别,不继承时没有区别。

访问属性

继承方式

1.png


总结:1.private成员不能被派生类访问;2.权限按小的合并。

1.公有继承(public)

使用的最多的继承方式。
父类中的私有不能在子类中访问,公有还是公有,保护还是保护。

class A
{
public:
    void show1()
    {
        cout << "A::show1(),公有方法" << endl;
    }
protected:
    void show2()
    {
        cout << "A::show2(),保护方法" << endl;
    }
private:
    void show3()
    {
        cout << "A::show3(),私有方法" << endl;
    }
public:
	int m_a = 0;
protected:
	int m_b = 1;
private:
	int m_c = 2;
};
class B :public A
{
public:
    void show()
    {
        show1();//可以,继承下来是public,,可以在类外访问
        show2();//可以,继承下来是protected,不可以在类外访问
        //show3();//不能访问
    
        cout << m_a << endl;//可以,继承下来是public,可以在类外访问
        cout << m_b << endl;//可以,继承下来是protected,不可以在类外访问
        //cout << m_c << endl;//不能访问
    }
};

int main()
{
    B bb;
    bb.show1();//public可以在类外访问
    //bb.show2();//错误,protected不能在类外访问

    bb.m_a = 100;//public可以在类外访问
    //bb.m_b = 200;//错误,protected不能在类外访问

    bb.show();//public可以在类外访问

    return 0;
}

1.png

说明:
(1).A中的show1,show2方法可以在子类B中被访问(第30,31行),但A中的私有方法show3在子类B中不能被访问(第32行)。
(2).show1在B中是公有,那么在类外也能被访问(第43行),但show2在B中是保护,在类外不能被访问(第44行)。
(3).A中的m_a,m_b可以在子类B中被访问(第34,35行)。但A中的私有成员m_c在子类B中不能被访问(第36行)。
(4).m_a在B中是公有,那么在类外也能被访问(第46行),但m_b在B中是保护,在类外不能被访问(第47行)。

2.保护继承(protected)

父类中的私有不能在子类中访问,公有变保护,保护还是保护。


//保护继承
class A
{
public:
    void show1()
    {
        cout << "A::show1(),公有方法" << endl;
    }
protected:
    void show2()
    {
        cout << "A::show2(),保护方法" << endl;
    }
private:
    void show3()
    {
        cout << "A::show3(),私有方法" << endl;
    }
public:
	int m_a = 0;
protected:
	int m_b = 1;
private:
	int m_c = 2;
};
class B :protected A
{
public:
    void show()
    {
        show1();//可以
        show2();//可以
        //show3();//不能访问
    
        cout << m_a << endl;//可以
        cout << m_b << endl;//可以
        //cout << m_c << endl;//不能访问
    }
};

int main()
{
    B bb;
    //bb.show1();//错误,protected不能在类外访问
    //bb.show2();//错误,protected不能在类外访问

    //bb.m_a = 100;错误,protected不能在类外访问
    //bb.m_b = 200;//错误,protected不能在类外访问

    bb.show();//public可以在类外访问

    return 0;
}

1.png

3.私有继承(private)

父类的私有在子类中不能访问,公有变私有,保护变私有。


//私有继承
class A
{
public:
    void show1()
    {
        cout << "A::show1(),公有方法" << endl;
    }
protected:
    void show2()
    {
        cout << "A::show2(),保护方法" << endl;
    }
private:
    void show3()
    {
        cout << "A::show3(),私有方法" << endl;
    }
public:
	int m_a = 0;
protected:
	int m_b = 1;
private:
	int m_c = 2;
};
class B :private A
{
public:
    void show()
    {
        show1();//可以
        show2();//可以
        //show3();//不能访问
    
        cout << m_a << endl;//可以
        cout << m_b << endl;//可以
        //cout << m_c << endl;//不能访问
    }
};

int main()
{
    B bb;
    //bb.show1();//错误,protected不能在类外访问
    //bb.show2();//错误,protected不能在类外访问

    //bb.m_a = 100;错误,protected不能在类外访问
    //bb.m_b = 200;//错误,protected不能在类外访问

    bb.show();//public可以在类外访问

    return 0;
}

1.png

说明:私有继承从上面看貌似和保护继承没有什么区别,实际上有区别,如果C再继承B,那么结果就不一样了。

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

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

相关文章

新手必看!场外期权交易的六大注意事项

场外期权交易的六大注意事项 对于初涉金融市场的投资者来说&#xff0c;场外期权交易无疑是一个既具吸引力又充满挑战的领域。为确保您在交易中能够稳健获利&#xff0c;以下六大注意事项值得每位新手仔细研读。 文章来源/&#xff1a;财智财经 一、深入理解期权基本概念 场…

QComboBox条目可选择状态

有时候下拉框需要根据情况&#xff0c;将某些条目设为不可点击状态&#xff0c;或者动态切换为可点击状态&#xff0c;可采用以下方法。 //item1可选ui->comboBox->setItemData(0, QVariant(-1), Qt::UserRole-1);//item2不可选ui->comboBox->setItemData(1, QVari…

kivy 百词斩项目 报错

AttributeError: FigureCanvasKivyAgg object has no attribute resize_event AttributeError: FigureCanvasKivyAgg object has no attribute resize_event 是一种常见的Python错误&#xff0c;当你试图访问一个对象&#xff08;在这个例子中是 FigureCanvasKivyAgg 对象&am…

华为鸿蒙开发-鸿蒙基于ARKTS开发之启动模式

前言 鸿蒙生态取得爆发式增长&#xff01; 截至3月底&#xff0c;已有超4000个应用加入鸿蒙生态。 而在今年1月中旬&#xff0c;华为刚宣布HarmonyOS NEXT鸿蒙星河版面向开发者开放申请&#xff0c;这一版本鸿蒙系统也被称为“纯血鸿蒙”。 当时&#xff0c;华为宣布首批200…

如何进行Android更新功能测试

Android系统是目前全球市场占有率最高的移动操作系统之一&#xff0c;每年都会发布多次更新&#xff0c;包括安全更新、功能更新等。在开发和发布新版本的过程中&#xff0c;功能测试是至关重要的一环。本文将介绍如何进行Android更新功能测试&#xff0c;并提供一些代码示例。…

19、Go Gin框架集成Swagger

介绍&#xff1a; Swagger 支持在 Gin 路由中使用一系列注释来描述 API 的各个方面。以下是一些常用的 Swagger 注释属性&#xff0c;这些属性可以在 Gin 路由的注释中使用&#xff1a; Summary: 路由的简短摘要。Description: 路由的详细描述。Tags: 用于对路由进行分类的标…

nodeJS社区新冠人群管理与老人疫苗小程序-计算机毕业设计源码65190

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究慨况 1.3B/S体系工作原理 1.4node.js主要功能 2 1.5论文结构与章节安排 3 2 社区新冠人群管理与老人疫苗小程序分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5…

Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

Linux 36.3 JetPack v6.0jetson-inference之语义分割 1. 源由2. segNet2.1 命令选项2.2 下载模型2.2.1 Cityscapes2.2.2 DeepScene2.2.3 MHP2.2.4 VOC2.2.5 SUN 2.3 操作示例2.3.1 单张照片2.3.2 多张照片2.3.3 视频 3. 代码3.1 Python3.2 C 4. 参考资料 1. 源由 分类和目标识…

HIK录像机GB28181对接相机不在线问题随笔

一、问题现象 【设备信息】型号&#xff1a;DS-8664N-I16-V3 V4.63.000 build 230412 【问题现象】HIK录像机使用GB28181对接异常相机无法正常上线&#xff0c;对接HIK相机可以正常上线。 【现场拓扑】现场拓扑如下 NVR侧使用固定公网IP地址。IPC侧使用家用宽带的方式&…

Intel x86+FPGA:智能AI计算机系统在支气管导航机器人的应用

随着人工智能的快速发展、技术的突破及应用领域的逐渐广泛化。医疗机器人作为人工智能时代在医疗领域应用的深化&#xff0c;能够有效帮助医生进行一系列的医疗诊断和辅助治疗&#xff0c;在有效缓解医疗资源紧张的问题下推动医疗信息化的发展。 智慧医疗场景应用 从应用场景来…

ctfshow-web入门-信息搜集(web11-web20)

目录 1、web11 2、web12 3、web13 4、web14 5、web15 6、web16 7、web17 8、web18 9、web19 10、web20 1、web11 域名其实也可以隐藏信息&#xff0c;比如flag.ctfshow.com 就隐藏了一条信息 查询域名的 DNS 记录&#xff0c;类型为 TXT&#xff08;域名的说明&#…

AI技术变革与企业服务创新

1、AI的技术变革 1&#xff09;AI市场规模 2&#xff09;AI大模型发展历程 3&#xff09;AIGC发展背景 4&#xff09;AIGC技术能力 AIGC的技术架构逻辑上分为基础层、技术层、能力层、应用层、终端层五大板块&#xff0c;其中核心技术层涵盖AI技术群和大模型的融合创新&#…

【QT】记录一次QT程序程序发布exe过程

记录一次QT程序程序发布exe过程 使用windeploy与enigma发布独立的QT程序第一步 QT编译输出 **release** 版本第二步 QT 自带 windepoyqt 补全链接库第三步 enigma virtual box压缩打包为单一exe最后参考 使用windeploy与enigma发布独立的QT程序 第一步 QT编译输出 release 版本…

layui左侧菜单栏,鼠标悬停显示菜单文字

layui封装的左侧菜单是固定宽度的&#xff0c;且左侧菜单栏在css里改变宽度&#xff0c;效果并不是很好&#xff08;还设计头部菜单栏&#xff09;&#xff0c;如果写js来让菜单栏能够拉伸&#xff0c;也比较麻烦&#xff0c;那怎么最简单的&#xff0c;让用户看到菜单的文字呢…

TIM时钟中断——输出捕获、输入捕获、编码器接口测速

输出捕获 通道与DMA 计算机中的通道是一种专用于输入/输出&#xff08;I/O&#xff09;操作的控制器&#xff0c;它充当了主机&#xff08;包括CPU和内存&#xff09;与外部设备之间数据传输的桥梁。通道的主要目的是提高系统的并行处理能力&#xff0c;允许CPU与I/O设备同时工…

探秘Facebook:社交媒体的未来之路

Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;一直处于数字社交革命的前沿。然而&#xff0c;随着科技和社会的不断发展&#xff0c;Facebook正面临着新的挑战和机遇。本文将探索Facebook的未来之路&#xff0c;揭示社交媒体的新趋势和发展方向。 1. 深度社…

二、Nginx目录结构与基本运行原理

目录 一、目录结构 二、运行原理 一、目录结构 我们使用tree 命令查看nginx的目录。如果tree 命令失效&#xff0c;需要安装tree工具 [rootlocalhost local]# yum install -y tree[rootlocalhost /]# tree /usr/local/nginx /usr/local/nginx ├── client_body_temp # PO…

PDF软件PDF Extra Premium + Ultimate 9.30.56026

PDF Extra Premium是一个适用于Windows的程序,它提供了所有功能,***在一个地方处理PDF文件的需要。使用此程序,您可以: 扫描和识别文本。您可以轻松地将纸质文档扫描并数字化为可编辑的PDF文件。您可以使用手机的摄像头扫描任何类型的纸质文档:支票、合同、票据、票据、证…

外贸物流与报关操作全解析:避开那些常见的坑

外贸物流与报关是外贸流程中至关重要的环节&#xff0c;任何疏漏都可能导致货物延误、额外费用甚至违约赔偿。本文将详细解析外贸物流与报关操作的关键要点&#xff0c;并告诉你如何避开常见的坑。 一、外贸物流操作 外贸物流&#xff0c;即货物进出口的运输过程&#xff0c;涉…

JDK7 JDK8 JDK9接口中的默认方法、静态方法、私有方法

JDK8开始之后接口新增的方法 JDK7以前&#xff1a;接口中只能定义抽象方法 JDK8的新特性&#xff1a;接口中可以定义有方法体的方法&#xff08;默认、静态&#xff09; JDK9的新特性&#xff1a;接口中可以定义私有方法 接口中的默认方法InterA package com.itheima.a06;p…