秋招C++八股--封装、继承、多态(持续更新)

如题所述

C++中struct和class的区别

相同点:两者都可以用来定义用户自定义数据类型(UDT),都包含成员变量和成员函数。

不同点:默认情况下,class成员为私有(private),而struct成员为公有(public)。class支持封装和数据隐藏,可通过访问修饰符指定成员的访问权限(公有、私有或保护),而struct默认公开其成员。class可以实现继承和多态性,而struct不支持。在C++中,struct可以被视为class的一种特例,除了默认访问权限和继承方式不同之外,它们具有相同的特性和语法。

浅拷贝和深拷贝

浅拷贝只拷贝指针,并未开辟新的地址,指向的资源一旦释放,深拷贝也会出错。深拷贝不仅拷贝值,还会开辟新空间,即使原始对象被析构,深拷贝的值也不会受影响。

浅拷贝执行结果:

Student

copy Student

~Student 0x7fffed0c3ec0

~Student 0x7fffed0c3ed0

深拷贝执行结果:

Student

copy Student

~Student 0x7fffebca9fb0

~Student 0x7fffebca9fc0

类型安全

类型安全意味着代码不会尝试访问未经授权的内存区域。编程语言提供机制来实现类型安全,程序隐含类型错误也表示类型安全。但类型安全的编程语言和程序间没有必然联系,好程序员可以写出类型安全的程序,即使在类型不安全的语言中。

C++类型安全要点

C在局部上下文表现出类型安全,但内存分配函数(如malloc)返回void指针,可能导致类型转换错误,尤其是当尝试将char*转换为int*时。C++通过虚函数实现多态性,编译器为每个类生成虚表,每个对象拥有指向虚表的指针。构造函数时初始化虚指针,为子类对象分配虚表,实现多态性。

虚函数表和虚表指针

虚函数表是类的静态成员,存储虚函数地址,在类对象中通过vptr指针指向虚表。虚表位于只读数据段,而虚函数位于代码段。在对象创建时,vptr初始化指向所属类的虚表。

虚函数表和继承权限

public继承保持原有状态,protected继承保护成员,private继承使成员成为私有,无法被子类访问。

多态定义、种类、实现

多态允许以统一方式处理不同类型的对象,实现动态选择相应操作。静态多态通过函数重载和运算符重载,动态多态通过继承和虚函数。

纯虚函数

纯虚函数没有实现,目的是让派生类必须重写,实现抽象类。

子类重写虚函数表

子类重写虚函数替换基类虚函数的入口地址,通过对象的虚函数表调用正确实现。

菱形继承和虚拟继承

菱形继承解决二义性,通过虚拟继承确保共享的虚基类只有一份,节省存储。

哪些函数不能是虚函数

构造函数、内联函数、静态函数、友元函数和普通函数不能是虚函数。
温馨提示:内容为网友见解,仅供参考
无其他回答

秋招C++八股--封装、继承、多态(持续更新)
C++类型安全要点 C在局部上下文表现出类型安全,但内存分配函数(如malloc)返回void指针,可能导致类型转换错误,尤其是当尝试将char*转换为int*时。C++通过虚函数实现多态性,编译器为每个类生成虚表,每个对象拥有指向虚表的指针。构造函数时初始化虚指针,为子类对象分配虚表,实现多态性。虚函数表和虚表...

C++的封装、继承、多态
单一继承:继承一个父类,这种继承称为单一继承。一般情况尽量使用单一继承,使用多重继承容易造成混乱易出问题。多重继承:继承多个父类,类与类之间要用逗号隔开,类名之前要有继承权限,假使两个基类都有某变量,在子类中调用时需要加上类名限定符,例:c.a::i = 1;菱形继承:多重继承掺杂隔代...

c++什么是继承。卦装,多态呢?有知道的回答一下。
简单的说就是 继承就是细化类,给一个较泛化的、较抽象的类,添加更多内容,成为一个子类,就和分类学一样 封装是将对象状态和行为装在一起。多态就是可以以多种形态出现,比如一个类叫“人”,继承了“哺乳动物”这个类,那么人类的对象就既可以以人的形态出现,也可以以哺乳动物的形态出现,可以...

诺瓦星云提前批C++软件开发 ,纯八股面经
1. 多态实现:静态多态和动态多态各有优势,静态多态效率更高,动态多态则为运行时灵活性提供支持。2. map和unordered_map:map保证顺序,适用于需要有序操作的场景;unordered_map追求速度,适合无序查找。3. 虚析构函数:确保通过基类指针删除派生对象时,正确调用析构函数,避免资源遗漏。4. 进程间通...

c++三大特性
C++三大特性是封装、继承和多态。封装 封装是C++中的基本特性之一,也是面向对象编程的基石。它是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部属性,而是通过该类提供的方法进行访问和操作。封装的主要目的是增强安全性和简化编程,使用者只需知道对象提供哪些接口,而无需了解内部细节...

在C++编程里面,什么叫做面向对象、类、封装、继承、消息、多态性?请具...
对象就是 生活中的具体的东西(如电视机,飞机,...哎,世界是物质的啊),类就是(东西)的设计图纸或模板,就是画了个图还没开始生产,定义对象是就开始生产对象(东西)了。封装就是找个东西把代码包起来,不让人看到,这是类该干的活啊,如果想看到的话,请开个偷窥孔,public这家伙不地道啊...

2024届秋招剑心互娱游戏开发岗面经
面试官提问了C++运行main()函数前的准备工作,着重于理解操作系统如何初始化程序。数据结构部分,详细比较了堆栈在不同场景中的应用与区别,深入理解内存管理。内存管理部分则侧重于理解堆和栈之间的差异与应用场景,强调了对内存分配与回收机制的掌握。接着,讨论了面向对象的三大特性,即封装、继承和多态...

面向对象程序设计的三个特征是什么
面向对象程序设计的三大特征是多态(Polymorphism)、继承(Inheritance)、封装(Encapsulation)。1、多态 多态核心的思想就是,父类的引用能够指向子类的对象,或者接口类型的引用能够指向实现该接口的类的实例。多态会这样的原因是因为子类就是父类。2、继承 Java是单继承的,这一点和C++有所不同,这也就...

C++里比C里多出了继承,多态,虚函数是啥回事?求通俗解答………谢谢...
就好比你最早买的U盘是usb1.0的,后来有了usb2.0,现在是usb3.0,显然高版本的要比低版本的有更多的功能。同样的道理C++就比C语言多了一些功能(严格地说叫语言特性)。多出来的这部分内容有2大块,一个叫面向对象,也就是你说的封装、继承、多态;另外一部分叫泛型编程。C++首先比C多出了类...

c++里的类的继承和多态与Java里的继承和多态的区别是?
JAVA和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继承,多态)。而由于c++为了照顾大量的C语言使用者, 而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计...

相似回答
大家正在搜