【C++】继承与多态的一些练习题

学习完了继承与多态,当然要来点练习题啦~

第一题:

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;
}

在这里插入图片描述
答案:C
解析:先继承的先声明,先声明的先在前。
在这里插入图片描述

第二题:

打印的顺序是什么?

class A {
public:A(const char* s) { cout << s << endl; }~A() {}int _a;
};
class B :virtual public A
{
public:B(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }int _b;
};
class C :virtual public A
{
public:C(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }int _c;
};
class D :public B, public C
{
public:D(const char* s1, const char* s2, const char* s3, const char* s4) :B(s1, s2), C(s1, s3), A(s1){cout << s4 << endl;}int _d;
};
int main() {D* p = new D("class A", "class B", "class C", "class D");delete p;return 0;
}

答案:在这里插入图片描述

解释:由于我们使用了虚继承,那么就意味着只有一个A,在VS中,这个A一般在对象的末尾。

在这里插入图片描述
只有一个A的话那么初始化时只会初始化一次,但是我们的程序中一共调用了3次A的构造,在那个地方初始化呢?注意:我们的A是最先继承的,所以也是最先声明的(由于是虚继承,所以A的位置就不一定放在对象的最前边,由编译器决定),所以在一开始就会先初始化最先声明的,也就是先初始化A,然后是B与C在声明,所以在打印B与C,最后走完D的初始化列表,再打印D。

第三题:

打印的是什么呢?

class A
{
public:virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }virtual void test() { func(); }
};
class B : public A
{
public:void func(int val = 0) { std::cout << "B->" << val << std::endl; }
};
int main(int argc, char* argv[])
{B* p = new B;p->test();return 0;
}

答案:
在这里插入图片描述
解析:首先我们对func函数完成了重写,为什么呢?
子类的virtual可以不写,不必多说
可能有人会疑惑,参数不同啊,非也非也,我们在多态这说的参数是类型,并不是数值。
此外,我们虚函数的重写是对实现的重写,对接口是直接继承的,这也是我们重写名字的由来(覆盖是语法层的概念)

现在我们就可以正式的来解决这道问题了。
我们使用p调用test函数,注意是继承A的test函数,所以此时p发生切片变为A*,也就是this指针,我们使用指针父类指针调用,所以此时就构成了多态
所以调用的就是B的func,注意我们已经说了我们重写重写的是实现,继承的是接口,所以我们的val为1,所以我们就解决了这道问题!

一些面试题:

  1. 什么是多态?答:具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

  2. 什么是重载、重写(覆盖)、重定义(隐藏)?答:在这里插入图片描述

  3. 多态的实现原理?答:虚表指针与虚函数,由父类指针调用函数时,运行时会去虚表中找对应的虚函数,从而实现不同的行为

  4. inline函数可以是虚函数吗?答:表层来看:内联函数没有属于自己的地址,而虚函数地址要被放到虚表中,所以不可以是虚函数。 深层:通过编译,我们知道是可以的,首先我们要明确内联只是一个建议:当一个虚函数被声明为内联时,如果没有构成多态,编译器允许的情况下就会展开;如果构成多态,那么就无视inline,转而执行多态的行为

  5. 静态成员可以是虚函数吗?答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。

  6. 构造函数可以是虚函数吗?答:我们可以从两个维度理解:1.不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。2.派生类的构造会显示调用父类的构造函数,而若定义为虚函数那么只能只向谁调谁,显然不符合常理,在C++primer中也给这种情况起了名字,具体叫啥忘记了~注意:拷贝也是同理,但是赋值的话对应第二种情况。

  7. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?答:可以,并且最好把基类的析构函数定义成虚函数。

  8. 对象访问普通函数快还是虚函数更快?答:首先如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态调用,运行时调用虚函数需要到虚函数表中去查找。(由下图可见并不一定是构成多态才会多态调用,如果没有重写依旧会多态调用)在这里插入图片描述
    在这里插入图片描述

  9. 虚函数表是在什么阶段生成的,存在哪的?答:虚函数表是在编译阶段就生成的,一般情况下存在代码段(常量区)的。

  10. 什么是抽象类?抽象类的作用?答:抽象类强制重写了虚函数,另外抽象类体现出了接口继承关系。

后续也会继续更新!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot + Vue的学生宿舍课管理系统设计与实现+毕业论文(15000字)+开题报告

系统介绍 本系统包含管理员、宿管员、学生三个角色。 管理员&#xff1a;管理宿管员、管理学生、修改密码、维护个人信息。 宿管员&#xff1a;管理公寓资产、管理缴费信息、管理公共场所清理信息、管理日常事务信息、审核学生床位安排信息。 学生&#xff1a;查看公共场所清理…

SSH 免密登录,设置好仍然需要密码登录解决方法

说明&#xff1a; ssh秘钥登录设置好了&#xff0c;但是登录的时候依然需要提供密码 查看系统安全日志&#xff0c;定位问题 sudo cat /var/log/auth.log或者 sudo cat /var/log/secure找到下面的信息 Authentication refused: bad ownership or modes...&#xff08;网上的…

外卖系统微信小程序支付

微信小程序支付时序图 其中第9.步骤就是微信小程序前端调用wx.requestPayment

Vue3实战Easy云盘(三):文件删除+文件移动+目录导航+上传优化/文件过滤/搜索

一、文件删除 &#xff08;1&#xff09;选中了之后才可以删除&#xff0c;没有选中时就显示暗调删除按钮 &#xff08;2&#xff09;实现选中高亮功能 &#xff08;3&#xff09;单个删除 &#xff08;4&#xff09;批量删除 Main.vue中 <!-- 按钮3 --><!-- 如果sel…

交易复盘-20240513

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 双成药业 (1)|[9:30]|[3566万]|0.34 中通客车 (1)|[9:43]|[7678万]|0.15 嘉华股份 (2)|[9:30]|[36…

AI跟踪报道第41期-新加坡内哥谈技术-本周AI新闻:本周Al新闻: 准备好了吗?事情即将変得瘋狂

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于MetaGPT的智能体理论与实践-Task01

Task01: MetaGPT环境配置 学习教程&#xff1a;https://github.com/datawhalechina/hugging-multi-agent 1 环境准备 1.1 安装python3.9 通过&#xff1a;python3 --version, 查看此python版本为3.10.3 1.2 下载MetaGPT 开始&#xff0c;借用清华镜像&#xff0c;拉取…

【ARM Cortex-M 系列 2.2 -- Cortex-M7 单步调试原理及实现详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 单步调试概述单步执行原理Debug stepping control using the DHCSR 紧接上篇文章 【ARM Cortex-M 系列 2.1 – Cortex-M7 Debug system registers】 单步调试概述 在ARMv7-M架构中&#xff0c;通过使用单步调试&#xff08;Haltin…

【软设】常见易错题汇总

目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法&#xff08;结构化与面向对象&#xff09; 数据库 操作系统 知识产权相关的法律法规 &#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f9…

UE4_照亮环境_不同雾效的动态切换

一、问题及思路&#xff1a; 我们在一个地图上&#xff0c;经常切换不同的区域&#xff0c;不同的区域可能需要不同的色调&#xff0c;例如暖色调的野外或者幽暗的山洞&#xff0c;这两种环境上&#xff0c;雾效的选用肯定不一样&#xff0c;夕阳西下的户外用的就是偏暖的色调&…

OS复习笔记ch5-4-2

引言 承接上文我们介绍了信号量机制和应用信号量机制实现的进程同步和互斥&#xff0c;这一节我们将围绕一些经典问题对信号量机制展开更深入地探讨。 读者/写者问题 读者/写者问题与我们之前遇到的问题类型不同&#xff0c;它描述的是&#xff1a; 有读者和写者两组进程&am…

4.uniapp+vue3项目使用vuex

文章目录 1. uniappvue3项目使用vuex1.1. main.js引入store1.2. 创建store/index.js1.3. 项目中引用1.4. 开始解决实际问题1.5. vuex和storage的区别 1. uniappvue3项目使用vuex 这篇文章&#xff0c;既是使用的教程&#xff0c;也是用来解决一个实际问题&#xff1a;uView自定…