1. 画多重继承虚函数表
注:虚函数表是一种编译时构建的数据结构,它用于在运行时解析对虚函数的调用,是一个存储类成员函数指针的数组。每个拥有虚函数的类都有一个对应的虚函数表。当类对象创建时,对象中会包含一个指向相应虚函数表的指针(称为vptr,虚指针)。这个指针是对象的隐式成员,由编译器自动添加到每个对象中。
每个对象的虚指针指向对应的虚函数表。虚函数表的布局和内容在编译时就已确定,里面存储的是类的虚函数的地址。当一个虚函数被调用时,实际上是通过虚指针来间接调用的。
虚函数表运行时才会被调用,允许通过基类指针或引用调用派生类的方法。特别灵活,子类可以覆盖父类的虚函数实现,而调用者无需知道具体的子类类型。
当然有额外的开销,虚函数调用通常比非虚函数调用慢,因为需要额外的间接寻址。内存也有额外的开销,每个对象需要额外存储一个虚指针,每个类需要一个虚函数表。
2. 循环与递归可以转换吗?各有啥特点
循环和递归是在编程中实现重复操作的两种基本方法。它们在功能上是等效的,理论上任何使用循环的代码都可以通过递归来实现,反之亦然。尽管如此,它们各有其特点和最适用的场景。
从循环到递归:将循环结构的代码转换成递归通常涉及将循环的迭代过程表达为递归调用。每次递归调用相当于循环的一次迭代,并在满足基本条件时结束递归。
从递归到循环:递归函数通常可以重写为使用栈的循环结构,其中栈用来模拟递归调用栈的行为。这种转换可以消除递归的开销,特别是对于深递归调用栈可能导致栈溢出的情况
递归特点:
自然表达:递归提供了一种简洁的方式来处理那些问题本身就是递归