北京 易控智驾

c++ 多态?

多态是c++三大特性之一,封装 继承 多态,简单来说就是同一个调用实现不同的操作。而虚函数是实现多态的机制,核心就是通过虚函数实现基类可以调用派生类的方法。一般情况下,一个函数的调用是在编译时静态确定的,而多态使得函数的调用可以在运行时动态确定。当使用类的指针调用成员函数时,普通函数由指针类型决定,而虚函数由指针指向的实际类型决定

子类不用必须重写虚函数,但是必须重写纯虚函数:

纯虚函数在基类中只有声明,没有实现。这是因为纯虚函数的目的是为了定义一个接口,规定了一种标准,要求继承这个类的子类必须实现这个函数。这样做的好处是可以确保所有的子类都会有这个函数的实现。如果子类没有重写基类的纯虚函数,那么这个子类仍然是一个抽象类,不能被实例化。只有当子类提供了纯虚函数的实现,这个子类才能被实例化,也就是说,它变成了一个具体的类。所以,子类必须重写纯虚函数,这是由纯虚函数的性质和目的决定的。 

class A声明了一个纯虚函数,class B:public A实现了纯虚函数,class C:public B之后还需要实现纯虚函数吗?

不需要。类B已经实现了类A的纯虚函数,所以类C作为类B的子类,不需要再次实现这个纯虚函数。当然,如果类C需要对这个函数进行不同的实现,它可以选择覆盖(override)这个函数。

 

构造函数可以是虚函数吗? 析构函数?

构造函数不可以是虚函数,析构函数可以是虚函数。

首先,我们已经知道虚函数的实现则是通过对象内存中的vptr来实现的。而构造函数是用来实例化一个对象的,通俗来讲就是为对象内存中的值做初始化操作。那么在构造函数完成之前,也即还没有进行初始化,此时vptr是没有值的,也就无法通过vptr找到作为构造函数和虚函数所在的代码区,所以构造函数只能以普通函数的形式存放在类所指定的代码区中。

而对于析构函数,当我们delete(a)的时候,如果析构函数不是虚函数,那么调用的将会是基类base的析构函数。而当继承的时候,通常派生类会在基类的基础上定义自己的成员,此时我们当然希望可以调用派生类的析构函数对新定义的成员也进行析构

unique_ptr shared_ptr

unique_ptr删除了拷贝构造函数和拷贝赋值函数

内存管理 栈 堆

 

emplace_back push_back

emplace_back 本质上就是T&& 右值引用 不创建临时对象 直接移动T的指针 效率肯定高于push_back

emplace_back 支持多个构造参数 push_back只支持一个构造参数

单例设计模式

详情见c++

inline

内联函数(声明和定义都要加inline)也是存放在代码区,内联函数在被调用时,编译器会用内联函数的代码替换掉函数,避免了函数跳转和保护现场的开销(实际上到底替不替换还要由编译器决定,即使声明为内联函数也有可能不替换,未声明成内联函数也有可能被编译器替换到调用位置,主要由编译器决定

排序算法 复杂度

详情见单独页面

posted @ 2023-12-08 21:52  ponder776  阅读(1)  评论(0编辑  收藏  举报