热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

寒武纪C++实习面试经验分享

本文详细介绍了C++中的一些关键知识点,包括继承方式、虚继承、多态性以及引用与指针的使用场景。通过具体实例和代码示例,帮助读者更好地理解和应用这些概念。


C++ 继承方式详解


在C++中,继承是一种重要的面向对象编程技术,允许一个类(派生类)继承另一个类(基类)的属性和方法。C++提供了四种主要的继承方式:public、protected、private以及虚继承(virtual inheritance)。



派生类会继承基类中定义的所有成员,但是否能访问这些成员取决于继承的方式。例如,public继承使得基类的公有成员在派生类中仍保持公有状态;而private继承则会使基类的所有成员在派生类中变为私有。



虚继承: 虚继承主要用于解决多重继承中可能出现的菱形问题,即当多个基类共同继承同一个祖先类时,为了避免在派生类中多次实例化同一个基类的问题,可以使用虚继承。例如,假设有一个类A,两个类B1和B2分别继承自A,而类D同时继承自B1和B2。如果不使用虚继承,D中将存在两个独立的A类实例。通过将B1和B2对A的继承设为虚继承,可以确保D中只有一个A类的实例。


class A {}; // 基类

class B1 : public virtual A {}; // 虚继承

class B2 : public virtual A {}; // 虚继承

class D : public B1, public B2 {}; // 多重继承

虽然虚继承有助于避免冗余,但在实际开发中较少使用,因为它会增加程序的复杂性和运行时的开销。



虚继承下的函数调用机制


在涉及虚继承的情况下,如何确保通过基类指针调用派生类中特定的重写方法是一个常见的面试问题。例如,如果有类B和C虚继承自A,而D同时继承自B和C,那么如何确保通过A*指针调用的是B中重写的虚函数?


#include 
using namespace std;

class A {
public:
virtual void fun() { cout <<"A::fun()." <};

class B : public virtual A {
public:
void fun() override { cout <<"B::fun()." <};

class C : public virtual A {
public:
void fun() override { cout <<"C::fun()." <};

class D : public B, public C {};

int main() {
A* a = new D;
A* b = new B;
a = b;
a->fun();
return 0;
}

上述代码中,通过将a指针指向B类的实例,确保调用了B中重写的虚函数。



多态性解析


多态性是面向对象编程的一个核心概念,它允许不同类的对象通过相同的接口进行操作。C++中的多态性分为静态多态性和动态多态性。



  • 静态多态性(静态联编): 由编译器在编译时确定调用的具体函数,通常通过函数重载实现。

  • 动态多态性(动态联编): 由运行时环境根据对象的实际类型确定调用的具体函数,通常通过虚函数实现。


例如,静态多态性可以通过函数重载实现:


int Add(int left, int right) {
return left + right;
}

float Add(float left, float right) {
return left + right;
}

int main() {
cout < cout < return 0;
}

而动态多态性则通过虚函数实现:


class Base {
public:
virtual void show() { cout <<"Base show." <};

class Derived : public Base {
public:
void show() override { cout <<"Derived show." <};

int main() {
Base* basePtr = new Derived();
basePtr->show(); // 动态绑定,调用Derived::show()
delete basePtr;
return 0;
}

动态多态性的实现依赖于虚函数表(vtable)和虚函数指针(vptr),这些机制确保了运行时的正确函数调用。



引用与指针的使用场景


在C++中,引用和指针都是用来间接访问对象的工具,但它们在使用场景上有所不同。



  • 使用引用的主要场景:

    • 当需要修改调用函数中的数据对象时。

    • 通过传递引用而不是整个对象,可以提高程序的运行效率。


  • 使用指针的主要场景:

    • 当需要管理动态分配的内存时。

    • 当需要表示“没有对象”(即空指针)的情况时。



具体选择使用引用还是指针,还需要考虑以下因素:



  • 如果数据对象较小,如基本数据类型或小型结构体,建议按值传递。

  • 如果数据对象较大,如大型结构体或类对象,建议使用引用或指针以提高效率。

  • 如果需要修改数据对象,建议使用引用。

  • 如果需要表示“没有对象”的情况,建议使用指针。



推荐阅读
  • 针对上一期关于 Windows 8 的问题,我们正在积极解决。本文提供 IE6,7,8 三个版本的单文件版下载,适用于 Windows Vista/7 系统,支持 x86 和 x64 架构。欢迎大家下载并分享。 ... [详细]
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • C#反射reflection
    C#shanzm目录简介引入1.新建类库2.类库的使用3.反射反射实例1反射实例2反射实例3简介反射(reflection)是什么?在《精通C#》中是这么说的“反射就是一个运行库发 ... [详细]
  • 本问题涉及对一个非负整数数组执行加一操作。数组以最高位数字在前的方式存储,每个数组元素仅包含一位数字。假设该整数没有前导零,除非该整数为0。 ... [详细]
  • .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
    .NETCore中的一个接口多种实现的依赖注入与动态选择看这篇就够了最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的 ... [详细]
  • 请看|差别_Android 6.0 运行时权限处理解析
    请看|差别_Android 6.0 运行时权限处理解析 ... [详细]
  • 本文介绍如何利用QFileSystemModel进行目录的浏览、创建及删除操作,并提供了一个简单的对话框界面实现。 ... [详细]
  • PHP 数据类型详解及其应用场景
    本文详细介绍了PHP中的八种数据类型,并探讨了它们各自的应用场景,帮助开发者更好地理解和使用这些数据类型。 ... [详细]
  • 01背包问题是算法领域中常见的优化问题之一,本文旨在回顾并详细解析其核心——状态转移方程的构建方法。通过设定物品数量、单个物品的重量与价值以及背包的最大承重,利用二维数组表示可能的最大收益,进而探讨如何通过状态转移方程实现最优解。 ... [详细]
  • 本文详细介绍了 Linux 内核 API 中的 prepare_to_wait 函数,包括其功能、使用方法和具体实现细节。 ... [详细]
  • 题目编号:1473 时间限制:1秒 内存限制:128MB 提交次数:99 解决次数:60 ... [详细]
  • PHP中一维数组的合并与去重技巧
    本文探讨了在PHP中如何有效地合并一维数组以及去除重复元素的方法,包括使用内置函数和自定义方法。 ... [详细]
  • 本次竞赛包含三个编程题目,旨在考察参赛者对数学逻辑及时间处理的能力。题目涉及筛选特定条件下的数字、Unix时间戳转换以及数列中元素关系的分析。 ... [详细]
  • 【UOJ】#37. 【清华集训2014】主旋律
    题解一道,神奇的题我们考虑正难则反,我们求去掉这些边后有多少图不是强连通的怎么求呢,不是强连通的图缩点后一定是一个DAG,并 ... [详细]
  • 浙江大学计算机专业的课程中,常见的一项活动是互评分组报告。在这个过程中,各小组轮流上台展示他们的项目,其他小组则负责打分。最终的成绩计算方法是:排除一个最高分和一个最低分后,剩余分数的平均值作为学生评分(记为G1),教师评分(记为G2)与之相加并取平均,结果四舍五入至整数。 ... [详细]
author-avatar
mobiledu2502857683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有