深入理解 C++ 三大特性之一 继承

深入理解 C++ 三大特性之一 继承

欢迎来到干货小仓库!!!

今日的Commit 是明日的 Releasse,用持续交付的心态活成终身迭代的版本。


1.继承的定义

1.1定义格式

1.2继承关系和访问限定符

1.3继承基类成员访问方式的变化

类成员/继承方式public继承protected继承private继承
基类的public成员派生类的public成员派生类的protected成员派生类的private成员
基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员
基类的private成员在派生类中不可见在派生类中不可见在派生类中不可见
总结:

1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它

2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public>protected>private。4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强.

2.基类和派生类对象赋值转换

a. 派生类对象 可以 赋值给基类的对象/基类的指针/基类的引用。(向上转换/切割/切片,不会产生临时变量)

b. 基类对象 不能赋值给 派生类对象。(禁止 向下转换)

3.继承中的作用域

① 在继承体系中 基类派生类 都有独立的作用域。

②子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)

③ 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。

④ 注意在实际中在继承体系里面最好不要定义同名的成员

代码示例:

示例一:相同的成员变量,默认先访问派生类中的

class Person { protected : string _name = "小李子"; // 姓名 int _num = 111;   // 身份证号 }; class Student : public Person { public: void Print() { cout<<" 姓名:"<<_name<< endl; cout<<" 身份证号:"<<Person::_num<< endl; cout<<" 学号:"<<_num<<endl; } protected: int _num = 999; // 学号 }; void Test() { Student s1; s1.Print(); };

示例二:相同的函数名,构成隐藏

// B中的fun和A中的fun不是构成重载,因为不是在同一作用域 // B中的fun和A中的fun构成隐藏,成员函数满足函数名相同就构成隐藏。 class A { public: void fun() { cout << "func()" << endl; } }; class B : public A { public: void fun(int i) { A::fun(); cout << "func(int i)->" <<i<<endl; } }; 

4.派生类的默认成员函数

a. 继承中 基类的成员声明 默认在派生类的成员声明的前面,初始化列表的顺序按声明顺序初始化.

b. 派生类的基类若没有默认构造,则需要在初始化列表中 对 基类进行 初始化.

c. 派生类中 会自动 基类的析构,把基类自己的资源进行释放。(不需要我们手动调用)

无需我们显示调用基类的析构----->编译器做了处理(子类析构函数完成时,自动调用基类的析构函数),由于交给我们手动释放会 无法保证先析构派生类,再析构基类。

为什么要先析构派生类 再析构基类?

由于 子类可能 使用到了 基类中的资源。

d. 编译器会统一把析构函数的函数名,进行特殊处理,处理成destructor(),由于后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同。

5.继承与友元

友元关系不能继承,也就是说基类的有源不能访问子类私有成员和保护成员。

示例:改代码编译不通过,出现语法错误

class Student; class Person { public: friend void Display(const Person& p, const Student& s); protected: string _name; // 姓名 }; class Student : public Person { protected: int _stuNum; // 学号 }; void Display(const Person& p, const Student& s) { cout << p._name << endl; cout << s._stuNum << endl; } int main() { Person p; Student s; Display(p, s); return 0; }

6.继承与静态成员

若基类定义了 static静态成员,则整个体系里面只有一个这样的成员。无论派生出多少个子类都只有一个 static成员示例。(相当于只是拥有使用权)

静态成员变量属于父类和派生类。

示例:

7.复杂的菱形继承及菱形虚拟继承

单继承:一个子类只有一个直接父类时称这个继承关系为单继承

多继承:一个子类有两个或两个以上直接父类时称这个继承关系为多继承。

菱形继承:是多继承的一种特殊情况。

导致 最后一个派生类有两份  class  Person 的数据,形成了 数据冗余和二义性。

解决方式:菱形虚拟继承,加上 virtual(继承公共基类的派生类上加)

7.1菱形虚拟继承底层原理

class A { public: int _a; }; class B : virtual public A { public: int _b; }; class C : virtual public A { public: int _c; }; class D : public B, public C { public: int _d; }; int main() { D d; d.B::_a = 1; d.C::_a = 2; d._b = 3; d._c = 4; d._d = 5; return 0; }

菱形虚拟继承的内存对象模型:

这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A

7.2习题

8.继承和组合的区别

9.继承的总结和反思


觉得不错的可以点赞+收藏咯!!!谢谢大家

Read more

Pi0机器人VLA大模型在昇腾A2平台上的测评

Pi0机器人VLA大模型在昇腾A2平台上的测评

Pi0机器人VLA大模型在昇腾A2平台上的测评文档 * 写在最前面 🌈你好呀!我是 是Yu欸🚀 感谢你的陪伴与支持~ 欢迎添加文末好友🌌 在所有感兴趣的领域扩展知识,不定期掉落福利资讯(*^▽^*) 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 随着人工智能技术的持续神户以及人形机器人产业的快速发展,算力在提升机器人运动控制精度、实时响应能力与智能化水平方面的作用日益凸显。为实现降本增效,国产化算力代替需求不断攀升,本文基于国产化适配的 Pi0机器 VLA大模型,在昇腾 Atlas 800I A2服务器上完成部署与测试,结果表明:该模型在推理性能、推理精度及功能完整性等方面,不仅实现了与英伟达同级别硬件相当的算力表现,更在部分场景下表现出更优的运行效率。 这一成果充分表明:经过深度适配的国产大模型与国产算力平台,已具备支撑高端人形机器人智能化发展的核心技术能力。国产算力在人形机器人领域的应用场景广阔,正加速迈向自主可控、高效可靠的全新阶段。 一、测评概述 1.1 测试目的 本测评旨在验证Pi0机器人视觉

By Ne0inhk
web3.0颠覆互联网,域名将发挥怎样的商业价值?

web3.0颠覆互联网,域名将发挥怎样的商业价值?

Web3.0颠覆下,域名的商业价值重构与落地路径 Web3.0以去中心化、用户主权、价值原生为核心,颠覆了Web2.0“平台垄断数据与价值”的格局,将互联网从“信息传输层”升级为“价值交互层”。传统域名作为“网络门牌”,仅承担IP地址映射与品牌标识功能;而Web3.0域名依托区块链技术,实现了所有权确权、可编程性与生态绑定,从单一工具升级为“数字身份入口、资产锚点、生态枢纽”,其商业价值围绕“身份主权、价值流转、生态协同”三大核心重构,覆盖个人、品牌、生态全维度。 一、核心价值重构:从“寻址工具”到“数字身份与资产枢纽” Web3.0的核心是“以人为本的价值回归”,域名作为用户在去中心化网络的首个触点,打破了传统域名“租赁式使用、中心化管控”的局限,成为承载数字身份与资产的核心载体,这是其商业价值的底层逻辑。

By Ne0inhk
【CANN】Pi0机器人大模型 × 昇腾A2 测评

【CANN】Pi0机器人大模型 × 昇腾A2 测评

【CANN】Pi0机器人大模型 × 昇腾A2 测评 * 写在最前面 🌈你好呀!我是 是Yu欸🚀 感谢你的陪伴与支持~ 欢迎添加文末好友🌌 在所有感兴趣的领域扩展知识,不定期掉落福利资讯(*^▽^*) 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 Pi0机器人VLA大模型测评 哈喽大家好呀!我是 是Yu欸。 最近人形机器人和具身智能真的太火了,大家都在聊 Pi0、聊 VLA 大模型。但是,兄弟们,不管是搞科研还是做落地,咱们始终绕不开一个问题——算力。 今天,我们一起把当下最火的 Pi0 机器人视觉-语言-动作大模型,完完整整地部署在国产算力平台上,也就是华为的昇腾 Atlas 800I A2 服务器上。 在跑通仓库模型的基础上,我们做一次性能测评。 我们要测三个最核心的指标:

By Ne0inhk
Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战

Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wallet_connect 的鸿蒙化适配指南 - 实现 Web3 钱包协议连接、支持 DApp 授权登录与跨链交易签名实战 前言 在进行 Flutter for OpenHarmony 的去中心化应用(DApp)或加密货币钱包开发时,支持标准的 WalletConnect 协议是链接用户钱包的关键。wallet_connect 是该协议的 Dart 实现,它能让你的鸿蒙 App 安全地与 MetaMask、Trust Wallet 等钱包建立双向加密连接。本文将探讨如何在鸿蒙系统下构建安全、稳定的 Web3 授权流程。 一、原理解析 / 概念介绍 1.1 基础原理

By Ne0inhk