首页 > 编程语言 >C++高频面试知识总结 part1

C++高频面试知识总结 part1

时间:2024-03-27 16:31:42浏览次数:22  
标签:Sound 函数 基类 多态 C++ part1 派生类 高频

面向对象

1.什么是类?

是一种用户定义的数据类型,包含了数据成员和函数成员。数据成员存储与类相关的状态,函数成员定义对数据进行操作的方法。

2.面向对象程序设计思想?

面向对象程序设计(OOP)有三大特征,封装继承和多态。
封装:将数据属性和操作方法打包,形成独立的对象,只暴露必要的接口。
继承:允许子类继承父类的属性和方法,并且可以创建新的方法。
多态:不同类的对象使用同一接口进行调用,有不同的行为。

3.多态的实现?

  • 静态多态:编译时发生,通过函数重载、运算符重载实现
    • 函数重载:参数类型或者数量不同来实现
    • 运算符重载:为类定义新的操作符函数
  • 动态多态:运行时发生,通过虚函数实现
    • 虚函数:一个函数在基类被声明为虚函数时,可以在派生类重写
    • 纯虚函数和抽象类:类中声明一个虚函数不提供实现(=0)包含纯虚函数成为抽象类,抽象类不能被实例化,只能被继承,派生类必须提供纯虚函数的实现

4.动态多态的作用?

允许运行时通过基类指针或引用调用派生类的方法,使得相同操作有不同的效果。
实现的必要条件:
1.继承:必须有两个类,基类和派生类
2.基类中有虚函数:基类中至少一个函数被virtual关键字声明为虚函数,派生类通常会重写该虚函数
3.基类的指针或引用:需要通过基类的指针或引用掉用虚函数,这样c++运行时才能够根据虚函数表来决定调用哪个函数
4.动态绑定

5.动态绑定的实现?

通过虚函数实现。当我们用基类指针或引用调用一个虚函数,C++会根据对象实际类型决定调用的函数。示例code如下:

//基类
class Animal {
    virtual void Sound() {
        std::cout << "animal sound" << std::endl;
    }
};

//派生类
class Dog: public Animal {
    void Sound() override {
        std::cout << "Woof" << std::endl;
    }
};

class Cat: public Animal {
    void Sound() override {
        std::cout << "Maio" << std::endl;
    }
};

//基类指针调用派生类
Animal* animal = new Dog();
animal->Sound();//输出Woof 

6.纯虚函数的作用以及实现?

纯虚函数用于创建抽象类,不能直接实例化,只能被继承,用于定义派生类应当遵循的接口。
作用:

  1. 定义接口规范:规定了派生类必须实现的函数,确保各派生类都遵循同一接口规范
  2. 阻止基类实例化:不能创建基类的对象,只能创建派生类对象

7.虚函数表如何维护?

当我们定义一个类,并且类中有虚函数时,这个类就会有一个虚函数表,存放类中所有虚函数地址的数组,在编译时,一个类的虚函数表就确定了,它放在了只读数据段中。。每一个实例,只要他的类有虚函数,那么就会有一个指向该虚函数表的指针,虽然不同的实例有自己的虚函数表指针,但是同一个类的所有对象共享一个虚函数表
比如说:

//基类
class Animal {
    virtual void Sound() {
        std::cout << "animal sound" << std::endl;
    }
};

//派生类
class Dog: public Animal {
    void Sound() override {
        std::cout << "Woof" << std::endl;
    }
};

class Cat: public Animal {
    void Sound() override {
        std::cout << "Maio" << std::endl;
    }
};

Animal* pig = new Animal();
Animal* mouse = new Animal();

pigmouse都有一个指针指向Animal的虚函数表,但是他们指向的虚函数表是相同的。
上述代码中子类cat继承自Animalcat类也会有虚函数表,但是sound()函数被重写了,cat类中虚函数表中sound的地址会被替换为cat sound的地址。

推荐阅读

C++多态虚函数表详解(多重继承、多继承情况)
C+±[override]关键字使用详解

8.C++ struct和类的区别?

在c++中极其相似,都可以包含数据成员,成员函数,构造析构函数,成员函数重载,运算符重载等。只有默认访问权限和默认继承类型的区别。
默认访问权限:class是private,struct是public
默认继承类型:class是private,struct是public

9.C++中类成员的访问权限?

三个访问修饰符
public:任何地方都可以访问
protect类内部派生类可以访问,但是不能通过类的对象直接访问
private:类内部访问,只能被类的成员函数友元函数访问

标签:Sound,函数,基类,多态,C++,part1,派生类,高频
From: https://blog.csdn.net/qq_32019913/article/details/137077848

相关文章

  • 【C++从0到1-黑马程序员】STL容器(一)
    ​​​​​​C++从0到1-黑马程序员课程学习笔记课程链接:23string容器-构造函数_哔哩哔哩_bilibili1.String容器1.1string基本概念本质:string是C++风格的字符串,而string本质上是一个类string和char*的区别:char*是一个指针string是一个类,类内部封装了char*,管理这......
  • 【OpenCV】OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信
     OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多......
  • C++复制构造函数、=运算符重载
    C++复制构造函数、=运算符重载#include<iostream>usingnamespacestd;classbase{private:intx,y;public:base():x(2),y(4){cout<<"basedefaultconstructor"<<endl;}base(intx,inty):x(x),y(y){cout<<"base......
  • C++面向对象整理(10)之异常与捕获(try、catch、throw、noexcept)
    C++面向对象整理(10)之异常与捕获(try、catch、throw、noexcept)注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的异常的捕获C++面向对象整理(10)之异常与捕获(try、catch、throw、noexcept)一、异常与捕获1、C++异常处理关键字:try,......
  • C++的数据类型
    1、整型的基本概念C++用int关键字来声明整型变量(int是integer的简写)。在声明整型变量的时候,可以在int关键字之前加signed、unsigned、short和long四种修饰符。signed:有符号的,可以表示正数和负数。unsigned:无符号的,只能表示正数,例如超女的身高和体重等。short:短的,取值范......
  • 使用C++20协程和io_uring优雅地实现异步IO
    距离2020年已经过去很久了,各大编译器对于C++20各项标准的支持也日趋完善,无栈协程也是其中之一,所以我就尝试着拿协程与io_uring实现了一下proactor模式,这篇文章用来记录一下我的设计和想法。除此之外,我们能在网络上找到许多优秀的C++20协程的教程以及许多优秀的协程应用(库),但从协程......
  • FFMPEG C++封装(一)(C++ FFMPEG)
    1概述FFMPEG是一个C语言开源视音频编解码库。本文将FFMPG4.1.3进行C++封装,形成C++FFMPG库。2架构架构图如下所示:架构说明:Init初始化FFMPEG库。IStream输入流,FFMPEG的输入音视频文件。Packet音视频数据包Decoder音视频编码器Frame音视频帧FilterGraph音视频......
  • 【蓝桥杯选拔赛真题48】C++九进制回文数 第十四届蓝桥杯青少年创意编程大赛 算法思维
    目录C++九进制回文数一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、推荐资料C++九进制回文数第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题一、题目要求1、编程实现提示信息:回文数:反向排列与原......
  • C/C++整形变量溢出问题
    参考C语言的整型溢出问题|酷壳-CoolShell   概述整形溢出分为无符号(unsigned)整型溢出和有符号(signed)整型溢出无符号整型溢出对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”比如,两个unsignedint类型求和溢出......
  • C++ map踩坑
    目录!!!不要直接使用[]来操作map,否则会有意想不到的错误。尽量使用map提供的函数(count、find、insert、erase)来操作map242.有效的字母异位词描述:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t......