c++—继承、继承方式

news/2024/2/29 2:21:38

1. c++三大核心功能

    (1)封装:提高代码的维护性,遇到问题可以准确定位;

    (2)继承:提高代码的复用性,注意不是ctrl+c,ctrl+v,而是不做任何修改或操作源码就能实现代码的复用;

    (3)多态:提高代码的扩展性;

2. 代码复用的两种方式

    (1)组合(has-a),在一个B类的内部,定义一个A类的实例化成员,这样就可以调用A类里面的成员或者方法;

        优点:方便操作,逻辑清晰,安全;

        缺点:要在B类中实例化很多其他类的成员,导致占用的内存很大;

#include <iostream>using namespace std;class A
{
public:void print(){cout<<"hello world"<<endl;}int m_num;
};class B
{
public:A a;  //组合的方式实现代码复用void print(){a.print();}int m_len; 
};int main(int argc, char **argv)
{B b;b.print();return 0;
}

    (2)继承(is-a),子类继承父类,或派生类继承基类;注意基类与派生类之间是相互独立的空间,不是共享成员;派生类的实例化对象的大小=基类对象的大小+派生类成员的大小;

        覆盖:当派生类拥有与基类相同的属性或者方法时,派生类会覆盖继承过来的属性与方法,空间还是增加的,不会不变;

        一共有三种继承方式,实际工程应用中只用public方式:

继承方式基类中的public成员基类中protect成员基类中private成员
public公有继承在派生类的内外均可见在派生类内部可见,外部不可见在派生类内外均不可见
protect保护继承在派生类的内部可见,外部不可见
private私有继承在派生类的内部可见,外部不可见在派生类内外均不可见
#include <iostream>using namespace std;class A
{
public:void print(){cout<<"hello world"<<endl;}int m_num;
private:int m_index;
};class B : private A
{
public:void test(){cout<<"A::m_num = "<<m_num<<endl;  //私有继承,只可以在派生类的内部查看,且只可以查看基类的公有成员;print();  //基类的公有函数也可以在类内查看;}int m_len; 
};int main(int argc, char **argv)
{B b;b.test();return 0;
}

3. 基类与派生类

    (1)派生类的构造函数:派生类从基类继承的成员还是要基类的构造函数初始化完成,派生类新增的成员,就在派生类的构造函数中初始化;具体执行顺序如下:

        ①如果派生类中含有其他类的实例化对象,就是说成员对象,那么构造函数的执行顺序:基类→成员对象→派生类构造函数;析构函数则相反;

        ②如果基类中没有无参构造函数(例如,只有有参的,那么这是系统提供的默认无参构造函数就失效了,需要自己写一个基类的无参构造函数),那么派生类里所有的构造函数都要显是调用基类的构造函数(例如自定义有参构造函数等);

        ③若一个派生类继承了多个基类,那么基类中的构造函数执行顺序与其继承顺序相关(即public的前后顺序);

        ④若要调用内嵌的成员对象的构造函数是,执行顺序按照它们在类中的声明顺序执行;

    (2)函数遮蔽

        就是指派生类中有与基类重名的函数,相当于重载了基类中的函数方法,系统优先调用派生类自己的函数,如需要调用基类中的函数,需要加作用域限定符;总之就是如需要调用基类的一些函数,包括普通成员函数、拷贝构造函数、移动拷贝构造函数等,都需要显式调用(第一个加作作用域限定符,后两个加显示调用,跟在派生类的对应构造函数后面);

示例:

#include <iostream>using namespace std;class A
{
public:A(){cout<<"A"<<endl;}A(int num):m_num(num){cout<<"A int"<<endl;}void print(){cout<<"hello world"<<endl;}~A(){cout<<"~A"<<endl;}// private:int m_num;int m_index;
};class B : public A
{
public:B():A()  //派生类中的构造函数都要显式调用基类的构造函数;{cout<<"B"<<endl;}B(int len):m_len(len),A(len)  //派生类中的构造函数都要显式调用基类的构造函数;{cout<<"B int"<<endl;}void print(){cout<<"hi world"<<endl;}//private:int m_len; 
};int main(int argc, char **argv)
{B b1;B b2(5);b1.print();b1.A::print();  //B类中与基类中函数重名,发生了函数遮蔽/函数覆盖,若要调用基类的函数,需要作用于限定符;cout<<b2.m_num<<endl;return 0;
}


https://www.xjx100.cn/news/444356.html

相关文章

年度发布 | MeterSphere一站式开源持续测试平台发布v2.10 LTS版本

2023年5月25日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.10 LTS版本。这是继2022年5月发布v1.20 LTS版本后&#xff0c;MeterSphere开源项目发布的第三个LTS&#xff08;Long Term Support&#xff09;版本。MeterSphere开源项目组将对MeterSphere v2.10 LTS版…

院考 c语言知识点完整版

马上c语言考试了,写一篇博客根据考试范围对应了一下之前微信里老师发过的习题(考试会有很多原题),把题目整理一下,也帮助一下身边的小伙伴。欢迎评论交流。&#xff08;补充后两章完整版&#xff09; 一、考试范围 二、各章微信习题整理 第一章习题与知识点 1.一个c语言的执…

java字符串abcde_java aababcabcdabcde,获取字符串中每一个字母出现的次数

需求&#xff1a;"aababcabcdabcde",获取字符串中每一个字母出现的次数 分析&#xff1a; * A:定义一个字符串(可以改进为键盘录入) * B:定义一个TreeMap集合 * 键:Character * 值&#xff1a;Integer * C:把字符串转换为字符数组 * D:遍历字符数组&#xff0c;得到每…

高通平台LCM相关专业术语首字母缩写Acronyms(不断更新。。。)

高通平台LCM相关专业术语首字母缩写Acronyms ——Wu_Being 80-p3255-23_b_msm8953_display_quick_start.pdf Gamut Mapping (GM) Adaptive Brightness/ Backlight Adjustment (ABA) Content Adaptive Backlight (CABL) Fidelity Optimized Signal Scaling (FOSS) Apical A…

高通平台添加屏幕驱动

添加LK显示屏代码 修改/bootable/bootloader/lk/target/msm8952/oem_panel.c 添加屏幕厂家提供的驱动头文件&#xff0c;例&#xff1a; 将头文件添加到bootable/bootloader/lk/dev/gcdb/display/include/目录下 #include “include/panel_kd_ota7290b_1200p_video.h” stati…

mtk-disp开篇:名词扫盲

这里直接引用mtk对display的介绍&#xff1a; MDP&#xff1a;mutimedia data path DDP&#xff1a;display data path&#xff0c;MTK中这一部分叫ddp&#xff0c;下图是ddp的arch框图&#xff1a; OVL&#xff1a; RDMA & WDMA&#xff1a; OVL&#xff1a;Overlay&a…

linux系统的drm配置mipi,调试基于内核4.4的MIPI屏,是LINUX系统,求大佬帮忙

本帖最后由 彩虹的微笑 于 2018-12-10 21:02 编辑 5.870621] [drm] Rockchip DRM driver version: v1.0.1 [ 5.875929] rockchip-drm display-subsystem: devfreq is not set [ 5.882068] rockchip-vop ff940000.vop: invalid resource [ 5.887298] rockchip-vop ff94…

Vue + Element UI 实现权限管理系统 前端篇(九):接口格式定义

接口请求格式定义 前台显示需要后台数据&#xff0c;我们这里先把前后端交互接口定义好&#xff0c;没有后台的时候&#xff0c;也方便用mock模拟。 接口定义遵循几个规范&#xff1a; 1. 接口按功能模块划分。 系统登录&#xff1a;登录相关接口 用户管理&#xff1a;用户管理…