C++继承的基本意义

devtools/2025/2/5 7:13:49/

文章目录

    • 一、继承的本质和原理
    • 二、重载、隐藏和覆盖
    • 三、基类与派生类的转换

一、继承的本质和原理

继承的本质:a. 代码的复用 b.
类和类之间的关系:
组合:a part of… 一部分的关系
继承:a kind of… 一种的关系
在这里插入图片描述
总结:

  1. 外部只能访问对象public的成员,protected和private的成员无法直接访问。
  2. 在继承结构中,派生类从基类可以继承过来private的成员,但是派生类却无法直接访问。
  3. protected和private的区别?
    在基类中定义的成员,想被派生类访问,但是不想被外部访问,那么在基类中,把相关成员定义成protected保护的;
    如果派生类和外部都不打算访问,那么在基类中,就把相关成员定义成private私有的。
  4. 默认的继承方式是什么?
    要看派生类是用class定义的,还是struct定义的。
    class定义派生类,默认继承方式就是private私有的。
    struct定义派生类,默认继承方式就是public私有的。
  5. 派生类从继承可以继承来所有的成员(变量和方法),除过构造函数和析构函数
  6. 派生类怎么初始化从基类继承来的成员变量呢?答:通过调用基类相应的构造函数来初始化。
  7. 派生类的构造函数和析构函数,负责初始化和清理派生类部分
    派生类从基类继承来的成员的初始化和清理由谁负责呢?是由基类的构造和析构函数来负责。
  8. 派生类对象构造和析构的过程是:
    1.派生类调用基类的构造函数,初始化从基类继承来的成员;
    2.调用派生类自己的构造函数,初始化派生类自己特有的成员;
    …派生类对象的作用域到期了
    3.调用派生类的析构函数,释放派生类成员可能占用的外部资源(堆内存,文件);
    4.调用基类的析构函数,释放派生类内存中,从基类继承来的成员可能占用的外部资源(堆内存,文件)。
#include <iostream>
using namespace std;class Base {
public:Base(int data): ma(data) {cout << "Base()" << endl;}~Base() {cout << "~Base()" << endl;}
protected:int ma;
};class Derive : public Base {
public:Derive(int data)//: ma(data) //"Base":没有合适的默认构造函数可用: Base(data), mb(data){cout << "Derive()" << endl;}~Derive() {cout << "~Derive()" << endl;}
private:int mb;
};int main() {Derive d(20);return 0;
}

二、重载、隐藏和覆盖

  1. 重载关系
    一组函数要重载,必须处在同一个作用域当中;而且函数名字相同,参数列表不同。
  2. 隐藏(作用域的隐藏)的关系
    在继承结构当中,派生类的同名成员,把基类的同名成员给隐藏调用了。
  3. 覆盖
    基类和派生类的方法,返回值、函数名以及参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理成虚函数,它们之间成为覆盖关系。
#include <iostream>
using namespace std;class Base {
public:Base(int data): ma(data) {cout << "Base()" << endl;}~Base() {cout << "~Base()" << endl;}void show() { cout << "Base::show()" << endl; }void show(int) { cout << "Base::show(int)" << endl; }
protected:int ma;
};class Derive : public Base {
public://"Base":没有合适的默认构造函数可用Derive(int data = 20): Base(data), mb(data){cout << "Derive()" << endl;}~Derive() {cout << "~Derive()" << endl;}void show() { cout << "Base::show()" << endl; }
private:int mb;
};int main() {Derive d;d.show();// 优先找的是派生类自己作用域的show名字成员; 没有的话,才去基类里找d.show(10); //"Derive::show": 函数不接受 1 个参数return 0;
}

三、基类与派生类的转换

把继承结构,也说成从上(基类)到下(派生类)的结构。

#include <iostream>
using namespace std;class Base {
public:Base(int data = 10): ma(data) {cout << "Base()" << endl;}~Base() {cout << "~Base()" << endl;}void show() { cout << "Base::show()" << endl; }void show(int) { cout << "Base::show(int)" << endl; }
protected:int ma;
};class Derive : public Base {
public://"Base":没有合适的默认构造函数可用Derive(int data = 20): Base(data), mb(data){cout << "Derive()" << endl;}~Derive() {cout << "~Derive()" << endl;}void show() { cout << "Base::show()" << endl; }
private:int mb;
};int main() {Base b(10);Derive d(20);// 基类对象b <- 派生类对象d     类型从下到上的转换  Yb = d;// 派生类对象d <- 基类对象b     类型从上到下的转换  N// d = b;// 基类指针(引用) <- 派生类对象 类型从下到上的转换  YBase *pb = &d;pb->show();   // 只能访问基类部分Base::show()     ((Derive*)pb)->show();pb->show(10); // 只能访问基类部分Base::show(int)// 派生类指针(引用) <- 基类对象 类型从上到下的转换  N// Derive *pd = &b; // Derive *pd = (Derive*)&b; 类型强转不安全,涉及了内存的非法访问!return 0;
}

总结:在继承结构中进行上下的类型转换,默认只支持从下到上的类型的转换OK


http://www.ppmy.cn/devtools/156202.html

相关文章

【华为OD-E卷 - 任务最优调度 100分(python、java、c++、js、c)】

【华为OD-E卷 - 任务最优调度 100分&#xff08;python、java、c、js、c&#xff09;】 题目 给定一个正整数数组表示待系统执行的任务列表&#xff0c;数组的每一个元素代表一个任务&#xff0c;元素的值表示该任务的类型。 请计算执行完所有任务所需的最短时间。 任务执行规…

【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解

一、SIB33信令概述 在5G非地面网络&#xff08;NTN&#xff09;中&#xff0c;卫星的高速移动性和广域覆盖特性使得地面设备&#xff08;UE&#xff09;需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息&#xff0c;SystemInformationBlockType33&#x…

【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法

45. 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 num…

接口测试用例设计-笔记

接口测试的测试点 接口测试维度-功能测试 单接口功能测试&#xff1a;一个单独的业务&#xff0c;就对一个独立的接口。如登录业务&#xff0c;对应登录接口 业务场景功能测试&#xff1a;多个接口被连续调用。&#xff08;模拟用户的实际使用场景&#xff09; 接口测试维度-…

pytorch实现半监督学习

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;结合了有监督学习和无监督学习的特点&#xff0c;通常用于部分数据有标签、部分数据无标签的场景。其主要步骤如下&#xff1a; 1. 数…

QT知识点复习

1.qt核心机制 对象树、信号和槽、事件机制 2.对象树的作用 优化了内存回收机制。子对象实例化的时候&#xff0c;被父对象放对象树上&#xff0c;父对象释放内存&#xff0c;子对象也释放内存 3.信号和槽的作用 实现多个组件之间的通讯 4.信号和槽的几种连接方式 1.UI界面提…

STM32F103ZET6完整技术点(持续更新~)

①STM32②F③103④Z⑤E⑥T⑦6简介&#xff1a; ①基于ARM核心的32位微控制器&#xff0c;②通用类型&#xff0c;③增强型&#xff0c;④引脚数目144个 ⑤闪存存储器容量&#xff1a;512K字节&#xff0c;⑥封装:LQFP&#xff0c;⑦温度范围&#xff1a;工业级温度范围&#xf…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…