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:类内部访问,只能被类的成员函数友元函数访问

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值