【C++进阶之路】继承与多态的概念考察

news2024/12/24 2:22:50

文章目录

  • 一、问答题
  • 二、概念题
  • 三、答案与解析
    • 问答题
    • 概念题

一、问答题

  1. 什么是菱形继承?菱形继承的问题是什么?
  2. 什么是菱形虚拟继承?如何解决数据冗余和二义性的。
  3. 继承和组合的区别?什么时候用继承?什么时候用组合?
  4. 什么是多态?
  5. 什么是重载、重写(覆盖)、重定义(隐藏)?
  6. 多态的实现原理?
  7. inline函数可以是虚函数吗?
  8. 静态成员可以是虚函数吗?
  9. 构造函数可以是虚函数吗?
  10. 析构函数可以是虚函数吗?
  11. 对象访问普通函数快还是虚函数更快?
  12. 虚函数表是在什么阶段生成的,存在哪的?
  13. C++菱形继承的问题?虚继承的原理?
  14. 什么是抽象类?抽象类的作用?

二、概念题

  1. 下面哪种面向对象的方法可以让你变得富有( )
    A: 继承 B: 封装 C: 多态 D: 抽象

  1. ( )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关,而对方法的调用则可以关联于具体的对象。
    A: 继承  B: 模板  C: 对象的自身引用  D: 动态绑定

  1. 面向对象设计中的继承和组合,下面说法错误的是?()
    A:继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复用,也称为白盒复用
    B:组合的对象不需要关心各自的实现细节,之间的关系是在运行时候才确定的,是一种动态复用,也称为黑盒复用
    C:优先使用继承,而不是组合,是面向对象设计的第二原则
    D:继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封装性的表现

  1. 以下关于纯虚函数的说法,正确的是( )
    A:声明纯虚函数的类不能实例化对象
    B:声明纯虚函数的类是虚基类
    C:子类必须实现基类的纯虚函数
    D:纯虚函数必须是空函数

  1. 关于虚函数的描述正确的是( )
    A:派生类的虚函数与基类的虚函数具有不同的参数个数和类型
    B:内联函数不能是虚函数
    C:派生类必须重新定义基类的虚函数
    D:虚函数可以是一个static型的函数

  1. 关于虚表说法正确的是( )
    A:一个类只能有一张虚表
    B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表
    C:虚表是在运行期间动态生成的
    D:一个类的不同对象共享该类的虚表

  1. 假设A类中有虚函数,B继承自A,B重写A中的虚函数,也没有定义任何虚函数,则( )
    A:A类对象的前4个字节存储虚表地址,B类对象前4个字节不是虚表地址
    B:A类对象和B类对象前4个字节存储的都是虚基表的地址
    C:A类对象和B类对象前4个字节存储的虚表地址相同
    D:A类和B类虚表中虚函数个数相同,但A类和B类使用的不是同一张虚表

  1. 下面程序输出结果是什么? ()
#include<iostream>
using namespace std;
class A{
public:
	A(char *s) { cout<<s<<endl; }
	~A(){}
};

class B:virtual public A
{
public:
	B(char *s1,char*s2):A(s1) { cout<<s2<<endl; }
};

class C:virtual public A
{
public:
	C(char *s1,char*s2):A(s1) { cout<<s2<<endl; }
};

class D:public B,public C
{
public:
	D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s3),A(s1)
	{ cout<<s4<<endl;}
};

int main() {
	D *p=new D("class A","class B","class C","class D");
	delete p;
	return 0;
}

A:class A class B class C class D
B:class D class B class C class A
C:class D class C class B class A
D:class A class C class B class D


  1. 多继承中指针偏移问题?下面说法正确的是( )
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


  1. 以下程序输出结果是什么()
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;
}

A: A->0
B: B->1
C: A->1
D: B->0
E: 编译出错
F: 以上都不正确

三、答案与解析

问答题

  1. 什么是菱形继承?菱形继承的问题是什么?
    解析:菱形继承是多继承延伸出来的问题,可概括为"一子多父,多父共一父",这样导致了数据冗余和二义性问题,最关键的在于数据冗余,如果数据量过大,则会导致内存资源浪费的问题,二义性可通过指定作用域来解决。

  2. 什么是菱形虚拟继承?如何解决数据冗余和二义性的。
    解析:从概念上来讲,菱形虚拟继承是在菱形继承的基础上,在父类继承其基类时,前加virtual的现象,从原理上来讲,通过引用虚基表和虚基表指针,加以改变对象的存储模型,使最后一个位置存的是基类,原来存基类的位置换成了虚基表指针,虚基表指针指向的是虚基表,虚基表存放的是偏移量,第一个位置存放的是虚基表指针的地址相对于this指针的偏移量,计算方式:this指针 - 虚表指针的地址(通常为0或者-4),第二个位置存放的是虚基表指针的地址相对于基类的this指针 的偏移量,第三个位置存放的可能是相较于其它基类的偏移量。最后一个位置存放的是结束位置,VS下为0。这只是一个元素要存放的信息。通过如上操作,虚表和虚基表指针来达到节省内存空间的值,总的来说还是浪费几个字节的,不过相较于数据量很大的来说就忽略不计了,其次这样设计是为了考虑通用性,一个类直接用一张统一的虚基表和虚表指针即可。

  3. 继承和组合的区别?什么时候用继承?什么时候用组合?
    解析:在实现类的多态时,我们就不得不使用继承了,因为只有继承才能实现类的多态。在大多数情况下,能考虑用组合就用组合,因为组合更加符合高内聚低耦合的概念,使代码之间更加地完整和独立。

  4. 什么是多态?
    解析:从概念上来讲,就是一种事物对应不同种形态,符合 has_a的关系,从分类上来讲,多态分为函数重载和动态绑定,从实现角度上来讲,主要是通过基类的指针和引用以及虚函数和重写,来达到通过父类的指针或引用指向子类时,能够调用子类的虚函数而不是父类的虚函数。

  5. 什么是重载、重写(覆盖)、重定义(隐藏)?
    一张图理解:
    在这里插入图片描述

  6. 多态的实现原理?
    解析:从实现角度上来讲,主要是通过基类的指针和引用以及虚函数和重写,来达到通过父类的指针或引用指向子类时,能够调用子类的虚函数而不是父类的虚函数。

  7. inline函数可以是虚函数吗?
    解析: 这里我们要明确两个概念的区别内联函数和被inline关键字修饰的函数,被inline修饰的函数最终是不是内联是我们说了不算的,最终要靠编译器来决定的,虚函数前加inline并不是内联,因为如果是内联,那虚函数的地址就不会被存放在虚表中,而我们都知道虚函数是要存放在虚表中的,与概念相悖,因此虚函数可以被inline修饰,但是其不是内联函数。

  8. 静态成员可以是虚函数吗?
    解释:不是,因为静态成员没有this指针,仅通过对象和指定作用域调用即可,而多态调用是要传this指针,通过this指针来判断是否构成多态的条件,从而实现多态,因此不可能是虚函数。

  9. 构造函数可以是虚函数吗?
    解释:不可以,从语法上编译器就禁掉了,从原理层上来看,我们要考虑先有鸡还是先有蛋的问题,即先初始化虚表指针(蛋)再调用构造函数(鸡)。这是不现实的,因此只能通过构造函数初始化函数指针,在通过虚函数指针调用虚函数。

  10. 析构函数可以是虚函数吗?
    解释:可以,我们也推荐加上virtual,在实现多态时,如果不是虚函数,从而导致指向子类的父类指针,在进行delete时,只调用了父类的析构而没有调用子类的析构函数,这样可能会导致内存泄漏,因此可以,并强烈建议加上。

  11. 对象访问普通函数快还是虚函数更快?
    解释:普通函数在调用时,是直接call对应的函数地址,而虚函数需要先找到虚函数指针,再通过虚函数指针找到对应的地址,再进行调用,因此普通函数更快,但综合下来只在函数过多的情况下考虑这种问题,一般来说差别不大。

  12. 虚函数表是在什么阶段生成的,存在哪的?
    解释:虚函数表是在编译期间生成的,至少在VS下是存在常量区的。

  13. 什么是抽象类?抽象类的作用?
    解释:我们把具有纯虚函数的类称为抽象类,抽象类在运用角度来说,强制子类必须重写虚函数,否则无法进行示例化,因为继承了纯虚函数是无法示例化的。

概念题

在这里插入图片描述

  1. A 2. D 3. C 4. A 5. B
  2. D 7. D 8. A 9. C 10. B

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

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

相关文章

9:00开始面试,9:08就出来了,这问题问的实在是····

外包工作3年&#xff0c;今年裸辞跳槽&#xff0c;很幸运的是找到了下家&#xff0c;不过 自从加入到这家公司&#xff0c;每天不是在加班就是在加班的路上&#xff0c;薪资倒是给的不少&#xff0c;所以我也就忍了。没想到6月一纸通知&#xff0c;所有人都不许加班&#xff0…

网络防御(9)

.一、SSL工作过程是什么&#xff1f; SSL位于应用层和传输层之间&#xff0c;它能够为基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层&#xff1a; 上层为SSL握手协议&#xff08;SSL handshake protocol&#xff09;、SSLpassword变化协议&#xff08;S…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点&#xff08;golang/boomer&#xff09; 问题 资料获取方法 背景 很早之前&#xff0c;考虑单机执行能力&#xff0c;使用locust做过公司短信网关的压测工作&#xff0c;后来发现了一个golang版本的locust&#xff0c;性能…

HTML

HTML 1. 块级标签 标题&#xff1a; <h1>一级标题</h1> div: <div>这是一个div标签</div> p&#xff1a; <p>这是一个p标签&#xff0c;段落标签</p> <!DOCTYPE html> <html lang"en"> <head><meta charse…

使用 ESP32 Arduino 和机器学习实现WIFI室内定位

在这个 Arduino 机器学习项目中,我们将使用附近的 WiFi 接入点来定位我们所在的位置。为了使该项目正常运行,您需要一块配备 WiFi 的板,例如 ESP8266、ESP32 或 MKR WiFI 1010。 什么是室内定位? 我们都习惯了 GPS 定位,我们的设备将使用卫星来跟踪我们在地球上的位置。GP…

SOLIDWORKS Simulation的功能到底有多强大

说到知己知彼&#xff0c;这是一个老生常谈的问题&#xff0c;对于SOLIDWORKS Simulation来说&#xff0c;很多朋友经常问我&#xff0c;我要算一个某某问题&#xff0c;SOLIDWORKS Simulation能算么&#xff1f;其实&#xff0c;这个就是一个典型的不了解SOLIDWORKS Simulatio…

虚拟世界探索:科技之下的未来可能性

随着科技的飞速发展&#xff0c;人们对于虚拟世界的憧憬和探索也日益加深。虚拟世界&#xff0c;那是一个超越现实的概念&#xff0c;一个充满想象力和创造力的领域。然而&#xff0c;虚拟世界究竟有可能实现吗&#xff1f;这是一个引人深思的问题。 虚拟世界&#xff0c;首先让…

多格式兼容,PDM系统与BOM系统格式转换

在现代制造业的产品开发过程中&#xff0c;PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;和BOM系统&#xff08;Bill of Materials&#xff0c;物料清单管理&#xff09;是不可或缺的重要工具。PDM系统负责管理产品的图文档、规格参数等信息…

Python之多重继承

一、多重继承 Python支持多重继承&#xff0c;一个子类可以有多个“直接父类”。这样&#xff0c;就具备了“多个父类”的特点。但是由于&#xff0c;这样会被“类的整体层次”搞的异常复杂&#xff0c;尽量避免使用。 class A:def aa(self):print("aa") ​ class B…

VMware虚拟机NAT模式Ubuntu无法上网解决方案

发现只要NAT模式&#xff0c;ping地址时就报网络不可达&#xff0c;且右上方网络图标消失&#xff0c;但是外部USB网络设备又只能在NAT模式下使用。。。 博主的解决方案如下&#xff1a; 按WinR键入services.msc&#xff0c; 找到VMware DHCP Service、VMware NAT Service和V…

震惊!赴日IT程序员工作卷到开始卡学历了?

我想先问问哪个国家不卷呢&#xff1f;现在优秀的IT人才那么多&#xff0c;竞争激烈很正常&#xff0c;但是&#xff0c;如果你的学历和技能都很优秀&#xff0c;那么你就有很大的机会获得一份满意的IT工作。而对于想要去日本从事IT工作的人来说&#xff0c;日语可以算是一个加…

@想提高经济、管理效益的企业,是时候“种草”电子会计档案了

上海国家会计学院近期发布了一项评选报告——《2023年影响中国会计行业的十大信息技术》&#xff0c;它们分别是&#xff1a;数电发票、会计大数据分析与处理技术、财务云、流程自动化、电子会计档案、中台技术、新一代ERP、数据治理技术、商业智能&#xff08;BI&#xff09;、…

MySQL系列---分区表实验

目录 通用核心range分区分区表达式结果必须为整数必须连续递增区间插入区间必须存在 list分区分区表达式结果必须为整数分区枚举不可以重复插入区间必须存在 hash分区分区表达式结果必须为整数分区数量必须为正整数余数取摸决定分区 key分区分区表达式可以是任意类型分区表达式…

ChatGPT发展到了什么程度?代码生成,程序员将被取代?

前言 ChatGPT 是一个基于人工智能的聊天机器人&#xff0c;由 OpenAI 开发。ChatGPT 的历史可以追溯到早期的语言模型&#xff0c;例如循环神经网络 (RNN) 和长短时记忆网络 (LSTM)。如今的 ChatGPT-3 则是最新的版本。 ChatGPT发展到了什么程度&#xff1f;代码生成&#xff0…

文件或目录损坏且无法读取

如上图报错&#xff0c;我们直接用cmd命令输入【CHKDSK C: /F】然后回车 电脑重启后可以了&#xff0c;希望能帮助各位小伙伴

半监督学习(主要伪标签方法)

半监督学习 1. 引言 应用场景&#xff1a;存在少量的有标签样本和大量的无标签样本的场景。在此应用场景下&#xff0c;通常标注数据是匮乏的&#xff0c;成本高的&#xff0c;难以获取的&#xff0c;与之相对应的是却存在大量的无标注数据。半监督学习的假设&#xff1a;决策…

Greenplum功能调研

Greenplum 介绍 文章目录 Greenplum 介绍1. 背景介绍2. 特点3. 架构4. MPP结构5. MVCC6. 语法结构7. GreenPlum集群常用命令7. 维护8. 参考 1. 背景介绍 Greenplum。公司成立于2003年&#xff0c;2006年推出了首款产品&#xff0c;其主营业务关注在数据仓库和商业智能方面.Gre…

K最近邻算法:简单高效的分类和回归方法(三)

文章目录 &#x1f340;引言&#x1f340;训练集和测试集&#x1f340;sklearn中封装好的train_test_split&#x1f340;超参数 &#x1f340;引言 本节以KNN算法为主&#xff0c;简单介绍一下训练集和测试集、超参数 &#x1f340;训练集和测试集 训练集和测试集是机器学习和深…

个人对智能家居平台选择的思考

本人之前开发过不少MicroPython程序&#xff0c;其中涉及到自动化以及局域网控制思路&#xff0c;也可以作为智能家居的实现方式。而NodeMCUESPHome的方案具有方便添加硬件、容易更新程序和容量占用小的优势&#xff0c;本人也查看过相关教程后感觉部署ESPHome和编译固件的步骤…

科学与信息化杂志科学与信息化杂志社科学与信息化编辑部2023年第14期目录

科学视野 现代技术角度下对光纤通信传输技术的思考 崔文佳1-3 浅谈非道路移动机械污染防治难点与对策 刘华4-6 基层公路养护档案管理 高富丽7-9《科学与信息化》投稿&#xff1a;cnqikantg126.com 奉贤区第二次全国污染源普查及防治对策建议 卫伟10-12 数字化赋能在国土空间治理…