C++继承回顾

切割、切片

派生类对象可以赋值给 基类的对象 / 基类的指针 / 基类的引用。

这里有个形象的说法叫切片 或者切割。寓意把派生类中父类那部分切来赋值过去。

这里和相应的的扩充和截断不同,不会产生临时变量

  • 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类 的指针是指向派生类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(Run Time Type Information)的 dynamic_cast 来进行识别后进行安全转换

继承中的作用域

3.继承中的作用域

  1. 在继承体系中基类和派生类都有独立的作用域。
  2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,
    也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
  3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
  4. 注意在实际中在继承体系里面最好不要定义同名的成员

如果出现这样的情况,使用方法:

复制代码
#include<iostream>
#include<string>

using namespace std;

class People {
public:
	string name;
};

class Student: public People{

public:
	int number;
	string name;
};

class Techaer {

};

int main()
{
	Student st;

	st.name = "xiaowang";

	st.People::name = "xiaohe";

	return 0;
}

菱形继承

菱形继承是多继承的一种特殊情况,但是会导致一系列的问题:数据冗余和二义性问题,在在Assistant的对象中Person成员会有两份。

二义性:
冗余性:
使用虚继承解决菱形问题

在最开始产生菱形的地方进行虚继承

菱形问题的虚继承底层是采用了虚基表,将重叠的数据放在公共区域,通过在指定的类存储相应的偏移地址进行公共数据的访问

组合和继承

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。

组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。

复制代码
// Car和BMW 构成is-a的关系
   class Car{
   protected:
   string _colour = "白色"; // 颜色
   string _num = "陕ABIT00"; // 车牌号
   };
  
   class BMW : public Car{
   public:
   void Drive() {cout << "好开-操控" << endl;}
   };

  
   // Tire和Car构成has-a的关系
  
   class Tire{
   protected:
       string _brand = "Michelin";  // 品牌
       size_t _size = 17;         // 尺寸
  
   };
   class Car{
   protected:
   string _colour = "白色"; // 颜色
 
   string _num = "陕ABIT00"; // 车牌号
    Tire _t; // 轮胎
   }; 

继承就是直接 public 继承下来了,组合就是在一个类中含有另一个类做为自己的成员函数(直接就是类变量、或者类的指针)

组合比着继承的代码耦合度更低,能使用组合就尽量不要使用继承

相关推荐
h39742 小时前
DirectShow过滤器开发-视频源过滤器
c++·windows·音视频·directshow
程序猿编码3 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客4 小时前
vs 怎么根据dll 生成lib文件
c++·qt
程序员老陆5 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
qq_284274056 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_284274057 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan20248 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
半杯咖啡半行码8 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
xh didida9 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
垆边人似月.9 小时前
华为机试题 :两数之和
c++·算法·华为