继承与虚函数练习

news2024/11/25 15:32:23

Tip1 

 基类私有成员变量在子类中都不能直接访问,不是因为没有被子类继承,而是权限问题

Tip2 

满足多态的父子对象,父类对象和子类对象前4个字节都是虚表指针(vs2019下),父类与子类指向的是各自的虚表。

 Tip3

  1. 子类构造函数会调用父类构造函数初始化父类成员,再初始化子类成员。
  2. 子类析构函数会自动调用父类的析构函数析构父类部分成员,析构顺序和构造顺序相反。
  3. 先构造父类,再构造子类,先析构子类,再析构父类
  4. 子类构造函数的定义有时需要参考基类的构造函数:当创建子类对象时,如果父类的构造函数需要参数的话,那必须通过子类的构造函数来传参。

Tip4 

 子类在继承父类时,可以不明确指定继承方式,默认为private

test1:虚表的个数

假设D类先继承B1,然后继承B2,B1和B2基类均包含虚函数,D类对B1和B2基类的虚函数重写了,并且D类增加了新的虚函数,则:

A.D类对象模型中包含了3个虚表指针

B.D类对象有两个虚表,D类新增加的虚函数放在第一张虚表最后

C.D类对象有两个虚表,D类新增加的虚函数放在第二张虚表最后

D.以上全部错误

解析:

A.D类有几个父类,如果父类有虚函数,则就会有几张虚表,自身子类不会产生多余的虚表,所以只有2张虚表

B.正确

C.子类自己的虚函数只会放到第一个父类的虚表后面,其他父类的虚表不需要存储,因为存储了也不能调用

D.错误

 总结:

子类继承几个父类就有几张虚表,自己不会产生多余的虚表

子类自己的虚函数只会放到第一个父类的虚表后面。

 test2 :多继承的内存分布

下面哪项结果是正确的( )
class Base1 { public: int _b1; };
class Base2 { public: int _b2; };
class Derive : public Base1, public Base2 
{ public: int _d; };

int main()
{
    Derive d;
    Base1* p1 = &d;
    Base2* p2 = &d;
    Derive* p3 = &d;
    return 0;
}

A.p1 == p2 == p3

B.p1 < p2 < p3

C.p1 == p3 != p2

D.p1 != p2 != p3

分析:

p1和p2虽然都是其父类,但在子类内存模型中,其位置不同,所以p1和p2所指子类的位置也不相同,因此p1!=p2,

由于p1对象是第一个被继承的父类类型,所以其地址与子类对象的地址p3所指位置都为子类对象的起始位置,因此p1==p3,所以C正确

 

 test3:菱形继承

关于以下菱形继承说法不正确的是( )
class B {public: int b;};
class C1: public B {public: int c1;};
class C2: public B {public: int c2;};
class D : public C1, public C2 {public: int d;};

A.D总共占了20个字节

B.B中的内容总共在D对象中存储了两份

C.D对象可以直接访问从基类继承的b成员

D.菱形继承存在二义性问题,尽量避免设计菱形继承

分析:

A. C1中b和c1共8个字节,C2中c2和b共8个字节,D自身成员d 4个字节,一共20字节

B.由于菱形继承,最终的父类B在D中会有两份

C.子类对象不能直接访问最顶层基类B中继承下来的b成员,因为在D对象中,b有两份,一份是从C1中继承的,一份是从C2中继承的,直接通过D的对象访问b会存在二义性问题,在访问时候,可以加类名::b,来告诉编译器想要访问C1还是C2中继承下来的b。

D.对的,但如果真有需要,一般采用菱形虚拟继承减少数据冗余

所以选择C.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算中的容器技术及其实践案例

第一章&#xff1a;什么是容器技术 随着云计算和DevOps的普及&#xff0c;容器技术在IT行业中越来越受到关注。容器是一种轻量级、可移植、可扩展的应用程序封装技术&#xff0c;可以将应用程序及其所有依赖项打包到一个独立的可执行文件中。相对于虚拟机技术&#xff0c;容器技…

无界AI绘画基础教程,和Midjourney以及Stable Diffusion哪个更好用?

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 简单的总结 Midjourney&#xff0c;Stable Diffusion&#xff0c;无界AI的区别&#xff1f; Midjourney&#xff0c;收费&#xff0c;上手容易&#xff0c;做出来高精度的图需要自己掌握好咒语。咒语写不好&#xff0c;像…

【LLM大模型】LLM模型指令微调(更新中)

note 文章目录 note零、AIGC生成式模型1. 核心要素2. LLM evolutionary tree 二、LLM大模型1. ChatGLM&#xff08;1&#xff09;GLM-130B&#xff08;2&#xff09;ChatGLM-6B 2. LLaMA3. Chinese-LLaMA-Alpace4. Bloom5. PaLM 三、模型指令微调Reference 零、AIGC生成式模型 …

算法记录 | Day53 动态规划

1143.最长公共子序列 思路&#xff1a; 本题和动态规划&#xff1a;718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;“ace” 是 “abcde” 的子序列&#xff0c;但 “aec” 不是 “abcde” 的子序…

搭建DHCP、PXE、DNS、HTTP以及NFS服务综合实验的超详细讲解

文章目录 1.实验要求2.实验步骤2.1 步骤解答问题&#xff08;1&#xff09;2.1 步骤解答问题&#xff08;2&#xff09;2.1 步骤解答问题&#xff08;3&#xff09;2.1 步骤解答问题&#xff08;4&#xff09;2.1 步骤解答问题&#xff08;5&#xff09; 1.实验要求 &#xff…

Hadoop入门篇01---基础概念和部署教程

Hadoop入门篇01---基础概念和部署教程 Hadoop是什么Hadoop发展史Hadoop特点有哪些Hadoop版本Hadoop架构Hadoop 3.0新特性 Hadoop集群搭建集群简介集群部署方式standalone mode&#xff08;独立模式&#xff09;Pseudo-Distributed mode&#xff08;伪分布式模式&#xff09;Clu…

webpack的核心概念分别是什么,如何理解

这篇文章主要介绍了 title &#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考&#xff0c;希望大家通过这篇文章可以有所收获。 webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器&#xff08;module bundler&#xff09;&…

UE5.1.1C++从0开始(4.虚幻的接口以及交互功能)

这一个章节对于第一次接触虚幻的人来说可以说是最绕的一个点&#xff0c;因为老师突然给你塞了很多的概念&#xff0c;对于这一块的学习&#xff0c;我个人的推荐是&#xff1a;先把蓝图搞明白了&#xff0c;再对应到C的代码中&#xff0c;不然一定会被整的晕头转向。还是&…

安装ms sql server2000提示安装失败详见sqlstp.log日志

安装ms sql server2000提示安装失败详见sqlstp.log日志 目录 安装ms sql server2000提示安装失败详见sqlstp.log日志 一、可能的情况-其它位置不能有对它的引用 1.1、先安装了Delphi其options-环境变量-其中path中有sql&#xff0c;注册表将其清除 1. 2、注册表搜索-Micro…

【Unity3d】Unity3d在Android平台上输入框的实现源码分析

一、前言 Unity3d引擎中有很多与Android原生交互的功能&#xff0c;比如如何调用Android渲染、Unity输入框的实现、Unity权限的申请、Unity调用相机功能等等&#xff0c;其实这些就是调用Android的api实现的。所有Java层的实现代码都是在unity-classes.jar这个jar包中。这篇文…

chatgpt的150个指令大全

chatGPT输出结果的质量高低&#xff0c;和你使用什么样质量的输入内容有关。 今天&#xff0c;小编整理了一些常用的ChatGPT指令&#xff0c;可以通过这些指令让AI帮你整理资料、撰写报告、知识学习、准备面试等等&#xff0c;赶紧收藏起来吧&#xff01; 如果还没有找到工具…

两万字详解!Netty经典32连问

两万字详解&#xff01;Netty经典32连问&#xff01; 前言 Netty是什么&#xff0c;它的主要特点是什么&#xff1f; Netty 应用场景了解么&#xff1f; Netty 核心组件有哪些&#xff1f;分别有什么作用&#xff1f; Netty的线程模型是怎样的&#xff1f;如何优化性能&…

四、Spring Cloud Alibaba-Ribbon

一、什么是Ribbon 目前主流的负载方案分为以下两种: 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的(比如 F5)&#xff0c;也有软件的(比如 Nginx) 。客户端根据自己的请求情况做负载均衡&#xff0c;Ribbon 就属于客户…

2023年全国硕士研究生入学统一考试英语(一)试题

2023年全国硕士研究生入学统一考试英语&#xff08;一&#xff09;试题 Section I Use of Englis Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B , C or D on the ANSWER SHEET.(10 points) Caravanserais were roads…

【P9】JMeter 用户定义的变量(User Defined Variables)

一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设计 &#xff08;1&#xff09;、Test Plan 右键 <<…

Linux cgroup

前言 Cgroup和namespace类似&#xff0c;也是将进程进程分组&#xff0c;但是目的与namespace不一样&#xff0c;namespace是为了隔离进程组之前的资源&#xff0c;而Cgroup是为了对一组进程进行统一的资源监控和限制。 Cgroup的组成 subsystem 一个subsystem就是一个内核模…

【HCIP】VLAN实验(Hybrid模式)

目录 需求&#xff1a; 一、设计 二、VLAN配置 三、交换机间实现trunk的功能 四、路由器配置 五、验证 需求&#xff1a; 1、PC1和PC3所在接口为access 2、PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff1b;但PC4可以访问PC5&#xff0c;不能访问PC…

ARM嵌入式编译器-volatile关键字对编译器优化的影响

volatile限定符告知计算机&#xff0c;其他agent&#xff08;而不是变量所在的程序&#xff09;可以改变该变量的值。通常它被用于硬件地址以及在其他程序或同时运行的线程中共享数据。要求编译器不要对其描述的对象作优化处理&#xff0c;对它的读写都需要从内存中访问。 使用…

文献阅读:LLaMA: Open and Efficient Foundation Language Models

文献阅读&#xff1a;LLaMA: Open and Efficient Foundation Language Models 1. 文章简介2. 模型训练 1. 训练数据2. 模型结构3. 模型训练 1. Optimizer2. 效率优化 3. 效果评估 1. 经典任务下效果 1. Commen Sense Reasoning2. Closed-book Question Answering3. Reading Co…

数据分析03——矩阵常用计算方法和函数

0、前言&#xff1a; 数组&#xff1a;计算机领域的概念矩阵&#xff1a;数学领域的概念对于Numpy而言&#xff0c;矩阵是数组的分支 1、创建矩阵&#xff1a; 字符串创建矩阵&#xff1a;mat1 np.matrix(‘1 2;3 4’)列表形式创建矩阵&#xff1a;mat2 np.matrix([[5, 6],…