C++之继承

概念

生活中 :
子继承父遗留给的物质或精神产业
代码中 :
子类继承父类 , 可以降低代码的冗余度 , 提高代码复用率

名词

子类继承父类
父类派生子类

注意

一个父类可以派生多个子类
多个子类可以属于同一个父类
一个类可以继承多个父类

继承方式

作用

约束子类使用父类成员的范围
private 将父类中所有成员变为 private 修饰
protected 父类私有还是私有 , 父类受保护的还是受保护的 , 父类公共的变为受保护

public 父类成员访问是什么在子类中就是什么 ( 推荐使用 )

继承语法

语法

class 子类名:继承方式 父类名,继承方式 父类名2
{
//编写子类成员
};

子类中调用父类构造函数

语法

子类名 ( 形参列表 ): 父类名 ( 形参 1, 形参 2,..)
{
}

子父类对象转换

1.子类对象转换为父类对象

自动转换
无风险
如 :
Dog d;
Anim& a = d;

2.父类对象转换为子类对象

强制转换
有风险
如 :
Cat c;
Anim& a = c;
Dog& d = (Dog&) a;( 有风险 )
Cat& c2 = (Cat&) a;

注意

在强制转换时有风险 , 需要自身判断是否可以转换

继承关系中同名成员的区分

子父类成员变量名相同

子类对象.成员变量名 子类成员变量
子类对象 . 父类名 ::成员变量名 类成员变量

子父类成员函数名相同

子类对象 . 成员函数名 (实参列表) 子类成员函数
子类对象 . 父类名 :: 成员函数名 ( 实参列表) 父类成员函数

不能继承

父类构造函数
父类拷贝构造
父类析构
operator=

继承关系中的构造与析构顺序

父子类中

父构
子构
子析
父析

父子孙类中

父构
子构
孙构
孙析
子析
父析

子类成员变量为其他类的对象

父类构造
成员构造
子类构造
子类析构
成员析构
父类析构

多继承

概念

一个子类有多个父类

示例

#include <iostream>
using namespace std;
class Ma{
public:
char name50;
};
class Lv{
public:
char name50;
};
class LuoZi:public Ma,public Lv{
public:
char name50;
};
int main(int argc, char const *argv\[\])
{
LuoZi lz;
lz.Ma::name;
lz.Lv::name;
lz.name;
return 0;
}

菱形继承

概述

A 派生 B,C,D 多继承 B,C, 此时菱形继承
此时 D 中将有两份 A 的成员

示例

#include <iostream>
using namespace std;
class Anim{
public:
char name50;
};
class Ma:public Anim{
};
class Lv:public Anim{
};
class LuoZi:public Ma,public Lv{
};
int main(int argc, char const *argv\[\])
{
LuoZi lz;
lz.Ma::name;
lz.Lv::name;
return 0;
}

虚继承

作用

解决多继承或菱形继承得到多份

语法

当类继承时在继承方式前加 virtual
注意
A 派生 B,C,D 继承 B,C, 给 B,C 继承 A 时加

示例

#include <iostream>
#include <string.h>
using namespace std;
class Anim{
public:
char name50;
};
class Ma:virtual public Anim{
};
class Lv:virtual public Anim{
};
class LuoZi: public Ma, public Lv{
};
int main(int argc, char const *argv\[\])
{
LuoZi lz;
strcpy(lz.Ma::name," 骡子 ( 马 )");
strcpy(lz.Lv::name," 骡子 ( 驴 )");
strcpy(lz.name," 骡子 ");
cout << lz.Ma::name << endl;
cout << lz.Lv::name << endl;
cout << lz.name << endl;
return 0;
}

没有虚继承前的类图

Anim

​​​​​Ma

Lv

LuoZi

有虚继承的类图

Anim

Ma

Lv

LuoZi

vbtable: 虚基表
vbptr: 虚基指针

相关推荐
依然鸣9 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
库玛西11 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
AC赳赳老秦11 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
liulilittle12 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
qeen8712 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
Augustzero12 小时前
为什么线程不能说睡就睡?看懂等待与唤醒机制
c++·后端
程序员与背包客_CoderZ13 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶13 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_013 小时前
C++正则表达式
开发语言·c++·正则表达式
嵌入式阿蔡14 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库