(2.17)一面凉经

本文深入探讨了多态的两种形式——编译时多态和运行时多态,强调了虚函数在实现多态中的关键作用。同时,讨论了静态变量和静态函数的特性,以及它们在内存管理和代码封装中的应用。此外,文章还涉及哈希算法的基本概念、冲突解决策略,以及快速排序算法。操作系统方面,提到了线程池的优势和进程调度的原理。网络部分涵盖了路由协议如RIP和OSPF的工作机制。
摘要由CSDN通过智能技术生成

八股

一、说说多态

1、什么是多态:

        

2、多态的两种类型:编译时多态(重载)、运行时多态(重写/虚函数)

3、实现多态的条件(三个):

        (1)有继承

        (2)有虚函数重写(即动态绑定)

        (3)至少一个基类类型的指针或者基类类型的引用。(用于对虚成员函数进行调用)

4、基类中的虚函数必须要实现吗?

        基类中的虚函数如果是纯虚函数,不需要实现,此时基类不能实例化对象;main函数中没有基类及其子类的实例对象,可以不实现,有实例对象必须实现。

5、为什么抽象类不可以实例化对象?

        类实例化对象时,会为成员变量和成员函数分配内存,纯虚函数定义了成员函数地址为空,无法分配内存。

6、什么是动态绑定?

        程序执行期间判断所引用对象的实际类型,调用相应的方法。

        每个类会为所有的虚函数维护一个虚函数表,并且有一个指针指向这个表的首地址,这个虚函数表记录着该类所有虚函数的入口地址。当类被实例化后,会有一个虚函数表指针。

        指向动态绑定的三个条件:通过指针来调用函数(实际上指针指向虚函数表);指针upcast向上转型;调用的是虚函数。

7、函数重载是如何做到的?

        函数重载要求:函数名相同、函数参数的个数、类型与顺序至少一个不相同。对函数返回类型不做要求。只有返回类型不一样,无法构成重载。

c++代码在编译时根据参数列表对函数进行重命名。如fun(int,int)重命名为fun_int_int。函数重载本质上是不同的函数,占用不同内存,入口地址也不一样。

8、构造函数不可以是虚函数:虚函数要指针,构造函数完成前还没有把类实例化,没有地址。

9、析构函数必须是虚函数,可以是纯虚函数,但是必须要有结构体:如果不是虚函数,当一个基类指针指向子类后被释放时,不会调用子类的析构函数。子类调用析构函数实际上是调用了虚构函数链。

10、菱形继承问题:一个子类从不同路径继承父类,会导致实例化子类时实例化了两次基类成员,造成资源浪费。可以用虚继承解决。

二、stactic关键字

1、static意思是静态的,用于修饰局部变量、全局变量和函数。

修饰局部变量:变量不再存储于栈内,而是存储在静态区,被初始化为0。函数结束后不销毁,下次进入函数后该变量仍然存在。

修饰全局变量:普通全局变量定义在函数体外部,在静态区分配存储空间,编译器自动对其初始化。普通全局变量对整个工程可见,其他文件使用关键字extern外部声明后可以直接使用。 静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。 在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

修饰函数:在函数的返回类型前加上static,就是静态函数。例如:static int main() 静态函数只能在声明它的文件可见,其他文件不能引用该函数。不同文件可以使用相同名字静态函数 非静态函数可以在另一个文件直接引用。

三、指针和地址的区别

        指针是变量,它由地址和类型两部分构成,存储地址类型。指针的值是地址。地址只是一个十六进制字符,对应某段内存。

        变量是一个有名字的,可以供程序操作的存储空间。

四、函数指针和变量指针大小一样吗

        一样,64位下为8,32位下为4。

数据结构

一、HASH(散列)

1、哈希算法

哈希函数是一种映射关系。输入任意长度的数据,输出固定长度 的数据。

简单取余、线性函数算法、随机函数法等。

2、实现方法:通过一定的哈希算法,对一个对象的地址算得其哈希值。这个hash值就是hashcode,对应着hash表中的位置。

3、哈希冲突的解决办法:

①拉链法:用链表存储相同哈希值的元素

②扩容哈希

③引入红黑树:链表过长(默认超过8),将链表改为红黑树

④开放地址法/线性探测法

4、一致性哈希算法:

        分布式存储情况下,如何进行资源分配?【key-value】--哈希。

        简单取模哈希运算下,服务器扩张时会导致哈希映射的改变,资源的转移,因此引入哈希环。服务器与资源都有一个哈希环,服务器在哈希环上表现为节点,资源分配在右侧离其最近的节点上。

问题:分布不均。

解决办法:引入虚拟节点。因为节点越多,节点之间越均衡。

算法

一、快排

类似于分治。选取一个元素,使左边小于它,右边大于它。

操作系统

1、线程池

优点:避免频繁地销毁或者创建线程。

2、EPOLL底层实现:于select和poll的区别(掌握,待补)

3、core dump

核心转储。是程序崩溃时系统报错下来的快照。

4、进程是如何调度的:

调度算法:抢占、非抢占;

从优先级、时间片、短时间进程、先入先出等几个维度进行调度。

进程的上下文切换:

进程的上下文切换指的是CPU切换运行不同的线程。由PCB来维护一个进程。PCB包括进程的唯一标识符与分配给进程的内存。进程上下文切换本质是PCB的存档与新/旧PCB写入。

CPU的上下文切换:寄存器与程序计数器的保存与覆盖。寄存器与程序计数器指的是一个【任务】。根据【任务】的不同,CPU的上下文切换也指进程、线程or中断上下文切换。

5、命令行抓包:tcpdump

网络

1、路由协议:

常见的动态路由协议:RIP、OSPF、BGP、MPL

RIP(Routing Information Protocol)路由信息协议:记录路由器到目的网络所走过的距离;只和相邻路由器交换信息;路由信息变化时(不变化也会定期交换消息),向相邻路由器广播交换路由表,包括目的地、下一条路由器与跳数;使用距离向量算法;有跳数限制,适用于小型网络。收敛慢。

OSPF开放最短路径优先协议:是一种IGP协议,使用分布式的链路状态协议;会向AS内所有路由器发送消息(泛洪),内容包括自己的链路信息;会在链路变化时向所有路由器同步消息;没有跳数限制。

BGP:边界网关协议/域间路由协议。采用路径向量路由;交换到达某个网络所要经历的一系列路由。

MPLS:标签交换。

项目

1、P4底层

P4将输入转化为json格式输入bmv2

p4包括解析器、逆解析器、匹配动作表

p4中包头类型的长度需要字节对齐。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值