当前位置:网站首页>继承和友元,静态成员的关系
继承和友元,静态成员的关系
2022-07-31 23:34:00 【华为云】
5.继承与友元
友元关系不能继承,也就是说基类友元可以访问基类的私有和保护成员,但是不能访问子类私有和保护成员
例如:你爸爸的朋友你不一定认识

class Student;//声明class Person{public: //声明Display函数是Person类的友元 friend void Display(const Person& p, const Student& s);private: string _name;};class Student: public Person{private: int _stuid;};void Display(const Person& p, const Student& s){ cout << p._name << endl; //可以访问 cout << s._stuid << endl;//不可以访问}若想让Display函数也能够访问派生类Student的私有和保护成员,只能在派生类Student当中进行友元声明
class Student : public Person{public: //声明Display函数是Student类的友元 friend void Display(const Person& p, const Student& s);protected: int _stuid; };6.继承与静态成员
基类定义了static静态成员,则整个继承体系里面只有一个这样的静态成员。无论派生出多少个子类,都只有一个static成员实例 。
例如:当基类Person中定义了一个静态成员变量count,派生类Student和Teacher都继承了基类Person的成员,但是再整个继承体系中,只有一个静态成员变量count
我们可以通过该静态成员变量count的数值,得知创建的对象个数
由于通过派生类/基类创建一个对象,都需要调用基类的构造函数/拷贝构造函数初始化基类的部分成员,所以我们可以在基类的构造函数/拷贝构造函数中累加_count的值,就可以得知创建了多少个对象
//基类class Person{public: //基类的构造函数 Person() { ++_count; } //基类的拷贝构造函数 Person(const Person& p) { ++_count; }public: static int _count;//静态成员变量protected: string _name;};int Person::_count = 0;//静态成员变量在类外初始化//派生类class Student :public Person{private: int _stuid;};//派生类class Teacher :public Person{private: int _teaid;};void func(Student s){}//可以通过_count的大小得知创建的对象的个数int main(){ Student s1; Student s2 = s1; Teacher t1; Person p; func(s1);//传值传参也是一次拷贝构造 //_count成员是同一个 整个继承体系里面只有一个这样的静态成员 cout << Person::_count << endl;//5 cout << Student::_count << endl;//5 return 0;}验证:整个继承体系里面只有一个这样的静态成员
//三者的地址相同cout << &Person::_count << endl;cout << &Student::_count << endl;cout << &Teacher::_count << endl;\
边栏推荐
- NgRx 里 first 和 take(1) 操作符的区别
- Google Earth Engine——Error: Image.clipToBoundsAndScale, argument ‘input‘: Invalid type的错误解决
- MySQL数据库‘反斜杠\’ ,‘单引号‘’,‘双引号“’,‘null’无法存储
- 消息队列存储消息数据的MySQL表格
- The uniapp applet checks and prompts for updates
- C# Rectangle basic usage and picture cutting
- 面试突击69:TCP 可靠吗?为什么?
- 输入输出优化
- 一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题
- Binary tree non-recursive traversal
猜你喜欢

UOS统信系统 - WindTerm使用

Shell common script: Nexus batch upload local warehouse script

【MATLAB项目实战】LDPC-BP信道编码

消息队列存储消息数据的MySQL表格

【Acwing】The 62nd Weekly Game Solution

C# Rectangle basic usage and picture cutting

手写一个简单的web服务器(B/S架构)
I don't know what to do with sync issues

面试突击69:TCP 可靠吗?为什么?

Pytest first experience
随机推荐
TypeScript 的组件
SQL injection Less42 (POST type stack injection)
(26)Blender源码分析之顶层菜单的关于菜单
[QNX Hypervisor 2.2用户手册]9.16 system
thymeleaf iterates the map collection
【FPGA教程案例43】图像案例3——通过verilog实现图像sobel边缘提取,通过MATLAB进行辅助验证
SQL注入 Less47(报错注入) 和Less49(时间盲注)
LeetCode 第 304 场周赛
Pytest first experience
新产品如何进行网络推广?
字符编码和浮点型计算精度丢失问题
日常--Kali开启SSH(详细教程)
Usage of mysql having
Unity-通过预制件和克隆方法动态实现各个UGUI下控件的创建和显示
Pytest初体验
Payment module implementation
lua入门案例实战1234定义函数与标准函数库功能
游戏安全03:缓冲区溢出攻击简单解释
Difference between first and take(1) operators in NgRx
HTC using official firmware as bottom bag made ROM brush card bag tutorial