【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author:&Carlton

tag:C++

topic:【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

website:黑马程序员C++

date:2023年7月22日


目录

概要

继承规则

对象模型

构造析构顺序

同名与静态同名成员

多继承

菱形继承

VS开发人员命令操作提示窗口


概要

 

        继承是C++面向对象程序设计的三大特性之一(封装,继承,多态),既能有效利用已定义好的类,又允许添加之前定义的类中没有的代码,有效缩减代码量,使得程序更加简洁。

继承规则

        class 子类名 : 继承方式 父类名 { };

        继承方式有public,protected,private

对象模型

        父类所有成员都继承,只是根据继承方式不同继承得到的成员访问权限也相应改变:

       (父类的私有成员子类继承,但均无法访问,需要声明友元,以下说明不包括父类私有成员

        ①公开继承public: 访问权限相应继承

        ②保护继承protected: 全定为protected

        ③私有继承private: 全部变为private

        注:成员包括属性和函数

        子类对象模型结构(具体操作步骤在本文最后一小节说明):

        说明子类继承父类所有成员的例子:

#include <iostream>
using namespace std;

class Base
{
public:
	int m_a;
protected:
	int m_b;
private:
	int m_c;
};

class Son:public Base
{
public:
	int m_d;
};

void test01()
{
	Son s1;
	cout << sizeof(s1) << endl;
}

int main()
{
	test01();
	return 0;
}

构造析构顺序

        先构造父类,然后构造子类,析构顺序与构造顺序相反。

        

源代码:

#include <iostream>
using namespace std;

class Base
{
public:
	Base()
	{
		cout << "Base的构造函数" << endl;
	}
	~Base()
	{
		cout << "Base的析构函数" << endl;
	}
};

class Son :public Base
{
public:
	Son()
	{
		cout << "Son的构造函数" << endl;
	}
	~Son()
	{
		cout << "Son的析构函数" << endl;
	}
};

void test01()
{
	Son s1;
}

int main()
{
	test01();
	return 0;
}

程序运行结果:

同名与静态同名成员

        需要添加作用域,对于静态成员还能通过类访问。

         Son::Base::m_b << endl;    

        与Base::m_b含义不同,这里是在子类Son中访问父类Base作用域下的m_b静态成员变量

#include <iostream>
using namespace std;

class Base 
{
public:
	Base():m_a(100)//父类的初始化为100
	{

	}
	int m_a;
	void func()
	{
		cout << "Base-func()" << endl;
	}
	void func(int a)
	{
		cout << "Base-func(a)" << endl;
	}
	//子类有同名的成员函数时父类的成员函数被隐藏,无法直接使用占位参数区分,还是需要添加作用域区分
	static int m_b;
};

//静态成员变量类内声明,类外定义初始化
int Base::m_b = 100;

class Son:public Base
{
public:
	Son():m_a(200)//子类的初始化为200
	{

	}
	void func()
	{
		cout << "Son-func()" << endl;
	}
	int m_a;//有同名成员
	static int m_b;		//有静态同名成员
};
int Son::m_b = 200;


void test01()
{
	Son s1;
	cout << "子类m_a:" << s1.m_a << endl;
	cout << "父类m_a:" << s1.Base::m_a << endl;		//添加作用域
	s1.func();
	s1.Base::func();		//添加作用域
	s1.Base::func(10);
	//通过对象访问静态成员
	cout << "子类m_b:" << s1.m_b << endl;
	cout << "父类m_b:" << s1.Base::m_b << endl;
	//通过类访问静态成员
	cout << "子类m_b:" << Son::m_b << endl;
	cout << "父类m_b:" << Son::Base::m_b << endl;	//与Base::m_b含义不同,这里是在子类Son中访问父类Base作用域下的m_b静态成员变量
}

int main()
{
	test01();
	return 0;
}

多继承

class 子类名 : 继承方式 父类名1,继承方式 父类名2,……{ } ;

        多继承可能会带来同名成员的问题,但在实际开发过程中这块代码可能由几个人一起做,如果大量使用多继承则出现同名成员问题时寻找作用域会很麻烦。

源代码

#include <iostream>
using namespace std;

class Base1
{
public:
	int m_a;
};

class Base2
{
public:
	int m_b;
};

class Son :public Base1, public Base2		//继承Base1和Base2
{
	int m_c;
	int m_d;
};

void test01()
{
	cout << "sizeof(Son):" << sizeof(Son) << endl;
}

int main()
{
	test01();
	return 0;
}

多继承对象模型结构(具体操作步骤见本文最后一节):

菱形继承

        菱形继承:A被B、C继承,D继承B、C


        解决菱形继承的两个问题:①二义性矛盾 ②资源浪费
        ①二义性矛盾:“孙子不知道从父1那访问爷爷的东西还是从父2那里访问”
        ②资源浪费:无论从父1还是从父2,得到的东西是一样的,不需要得到两次

        解决方法:

        ①添加作用域

        ②使用关键字virtual虚继承

源代码:

#include <iostream>
#include <string>
using namespace std;

/*
* 解决菱形继承的两个问题:①二义性矛盾 ②资源浪费
* ①二义性矛盾:“孙子不知道从父1那访问爷爷的东西还是从父2那里访问”
* ②无论从父1还是从父2,得到的东西是一样的,不需要得到两次
*/

class School
{
public:
	School():m_slogan("厚德载物,格物致知")
	{
		
	}
	string m_slogan;
};

class Teacher1 :virtual public School {};		//加关键字virtual,虚继承

class Teacher2 :virtual public School {};

class Student :public Teacher1, public Teacher2 {};

void test01()
{
	Student s1;
	//cout << s1.m_slogan << endl;	//有二义性错误,m_slogan是Teacher1的还是Teacher2的
	cout << s1.Teacher1::m_slogan << endl;		//通过作用域解决第一个问题:二义性错误
	cout << s1.Teacher2::m_slogan << endl;
	cout << s1.m_slogan << endl;	//使用virtual虚继承可以不加作用域,都通过虚拟指针指向基类School的m_slogan,是同一个成员变量
}

int main()
{
	test01();
	return 0;
}

对象模型结构(具体操作步骤见本文最后一节):

使用虚继承前:

 

使用虚继承后:

vbtable:虚基类表

vb:virtual base 虚基类

ptr:pointer 指针

数字代表位移量

VS开发人员命令操作提示窗口

系统菜单里找到:

跳转盘符:

 

锁定文件路径(包含源文件的上一级目录):

 

应用:

        ①查看该文件路径下文件情况

   

 

        ②查看类对象模型结构

欢迎指正与分享,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/46630.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++从0到王者】第十二站:vector基本使用

文章目录 一、vector基本介绍二、vector的基本使用三、vector\<char> 和string的区别四、vector接口介绍1.vector的模板参数2.构造函数3.迭代器4.size和max_size5.resize和reserve6.operator[]和at7.front和back8.data9.push_back和pop_back10.insert和erase11.assign12.…

苍穹外卖 Spring Task 来单提醒 催单Apache ECharts day10~11

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供…

CHI协议之DVM操作

本文部分内容参考了CHI的Cache Stashing和DVM操作_谷公子的藏经阁的博客-CSDN博客 □ 注意此处RNF发送的noncopyback data, 只有8byte; □ MN会发送两个SNP给每个RNF, 因为一个SNP&#xff0c;携带的信息不够&#xff1b; □ 如果MN具备将来自同一个源头的non-sync/sync dvmop操…

Python post请求发送的是Form Data的类型

常规的Form Data 大部分的Form Data 可以直接都是可以通过正常的post请求进行提交的 import requestsheaders {自己设置的请求头键: 自己设置的请求头键,Content-Type: 网页接受的数据类型 }form_data {对应的键1&#xff1a;对应的值1,对应的键2&#xff1a;对应的值2, }r…

7、Java入门教程【面向对象】

面向对象是Java编程的核心概念&#xff0c;如果不能充分了解面向对象的思想&#xff0c;那么会给你在实际的项目开发过程中&#xff0c;带来很多业务设计上的困扰。 一、构造器 我们在设计完一个类&#xff0c;在使用这个类去创建对象实例的时候&#xff0c;有些场景是需要对…

css实现鼠标滑动左下角弹框带动画效果

代码 <div classNamekuang></div> css代码 .kuang {height: 500px;width: 400px;// background-color: #fff;position: absolute;z-index: 10;bottom: 0;transform: translateX(-390px)}.kuang:hover {animation: myanimation 3s linear 1;animation-fill-mode:f…

Django学习笔记-视图(views)的使用

Django中可以使用views进行管理&#xff0c;类似于WPF的MVVM的ViewModel层&#xff0c;也相当于MVC架构的模Controller层。 一、基于函数的视图FBV&#xff08;Function-Based View&#xff09; 通过定义一个函数&#xff0c;包含HttpRequest对象作为参数&#xff0c;用来接受…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求&#xff0c;领导要求整个QT项目中不要用UI方式来实现界面&#xff0c;这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下&#xff1a; 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…

【动态规划part07】| 70.爬楼梯(进阶)、322.零钱兑换、完全平方数

目录 &#x1f388;LeetCode70. 爬楼梯 &#xff08;进阶&#xff09; &#x1f388;LeetCode322. 零钱兑换 &#x1f388;LeetCode279.完全平方数 &#x1f388;LeetCode70. 爬楼梯 &#xff08;进阶&#xff09; 链接&#xff1a;70.爬楼梯进阶 假设你正在爬楼梯。需要 …

linux 内核总结

注意&#xff1a;队列只是一格以前的称呼&#xff0c;底层是链表 进程 多个cpu&#xff0c;每个cpu都有自己的进程队列 进程分类&#xff1a; 实时进程 与用户交互的进程&#xff0c;需要及时的响应&#xff08;优先级 0~100&#xff09; 普通进程 响应不需要那么及时的…

Python(四十一)流程控制语句——break

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Docker 全栈体系(六)

Docker 体系&#xff08;高级篇&#xff09; 三、Docker微服务实战 1. 通过IDEA新建一个普通微服务模块 建Module docker_boot 改POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

微信小程序数字键盘(仿微信转账键盘)

微信小程序input自带数字输入键盘&#xff0c;不过是直接调用的系统键盘&#xff0c;无法个性化。 代码中使用使用了Vant WeappVant UI小程序版&#xff0c;这里就不介绍相关安装说明了&#xff0c;大家自行安装Vant Weapp。 json 用到的组件 {"usingComponents": …

双智城市进展全扫描

本文将综合盘点16座智慧城市基础设施与智能网联汽车协同发展试点城市&#xff08;简称“双智试点城市”&#xff09;建设进展情况。2021年4月和12月&#xff0c;住建部和工信部两次联合印发通知&#xff0c;先后确定北京、上海、广州、武汉、长沙、无锡6个城市为第一批双智试点…

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer for Mac可以打开和查看Visio文件&#xff08;.vsd、.vdx和.vsdm文件&#xff09;。它具有简单易用的用户界面&#xff0c;可以快速加载和显示Visio文件。此外&#xff0c;它还支持导出文件为PDF、PNG、JPEG等格式&#xff0c;方便用户进行文件转换和共享。 Visio…

(202307)wonderful-sql:基础查询与排序(task2)

教程链接&#xff1a;Datawhale - 一个热爱学习的社区 知识学习 前提&#xff1a; 上一次任务中提出了本课程的用表&#xff0c;但是我并没有加入这个表&#xff0c;这次学习前先对这个表进行插入。 INSERT INTO product VALUES(0001, T恤衫, 衣服, 1000, 500, 2009-09-20)…

DevOps系列文章 之GitLabCI模板库的流水线

目录结构&#xff0c;jobs目录用于存放作业模板。templates目录用于存放流水线模板。这次使用​​default-pipeline.yml​​作为所有作业的基础模板。 作业模板 作业分为Build、test、codeanalysis、artifactory、deploy部分&#xff0c;在每个作业中配置了rules功能开关&…

【广州华锐互动】AR智慧机房设备巡检系统

AR智慧机房设备巡检系统是一种新型的机房巡检方式&#xff0c;它通过使用增强现实技术将机房设备、环境等信息实时呈现在用户面前&#xff0c;让巡检人员可以更加高效地完成巡检任务。 首先&#xff0c;AR智慧机房设备巡检系统具有极高的智能化程度。该系统可以根据用户设定的…

java代码审计6之ssrf

文章目录 1、java支持的网络请求协议&#xff1a;2、Java 中能发起⽹络请求的类2.1、仅⽀持 HTTP/HTTPS 协议的类2.2、⽀持 sun.net.www.protocol 所有协议的类2.3、审计关键词 3、靶场3.1、漏洞代码13.2、ftp协议读取技巧3.3、无回显之探测内网3.4、无回显之探测文件 之前的文…

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…