C++面试题

菱形继承

两个派生类继承同一个基类

又有某个类同时继承两个派生类

这种继承被称为菱形继承,或者钻石继承

两个类有共同的父类,又有共同的子类

菱形继承问题:

  1. 羊继承了动物的数据,驼集成了动物的数据,当羊驼使用数据时,就会产生二义性。
  2. 羊驼继承自动物的数据继承了两份,但这个数据我们只需要一份就可以了。

利用虚继承可以解决菱形继承的问题。

在继承之前,加上关键字virtual,变为虚继承。

虚基类指针指向虚基类表,虚基类表中记录了偏移量,指向唯一的数据

菱形继承是C++中独有的

C++具备其它语言没有的多重继承的特性。

多重继承:一个子类继承多个父类,这些父类可能继承同一个父类。

多态

多态分为两类

  • 静态多态:函数重载和运算符重载属于静态多态,复用函数名
  • 动态多态:派生类和虚函数实现运行时多态

静态多态和动态多态的区别:

  • 静态多态的函数地址早绑定------编译阶段确定函数地址
  • 动态多态的函数地址晚绑定------运行阶段确定函数地址

动态多态满足条件:

  1. 有继承关系
  2. 子类要重写父类的虚函数(返回值、函数名、参数列表要完全相同)

动态多态的使用:

  • 父类指针或引用指向子类对象:Animal &animal = cat;

当子类重写父类的虚函数时,子类中的虚函数表内部会替换成子类的虚函数地址。

当父类指针或引用指向子类对象的时候,发生多态

cpp 复制代码
Animal & animal = cat;

开闭原则:对扩展进行开放,对修改进行关闭。

纯虚函数和抽象类

在多态中,通常父类中虚函数的实现都是毫无意义的,主要都是调用子类重写的内容。

因此可以将虚函数改为纯虚函数

纯虚函数写法:将{}改为= 0;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点:

  • 无法实例化对象
  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

虚析构和纯虚析构

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。

解决方法:将父类中的析构函数改为虚析构或纯虚析构

虚析构和纯虚析构共性:

  • 可以解决父类指针释放子类对象
  • 都需要有具体的函数实现

虚析构和纯虚析构区别:

  • 如果是纯虚析构,该类属于抽象类,无法实例化对象

纯虚析构需要声明也需要实现

相关推荐
水云桐程序员1 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
测试员周周1 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
RSTJ_16252 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
想学习java初学者2 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦2 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
赏金术士2 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
weixin_449173653 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河3 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven
MegaDataFlowers4 小时前
运行若依项目
java
加号34 小时前
【Qt】 应用程序发布:依赖库拷贝与部署指南
开发语言·qt