多态性与抽象类的深入解析
1. 多态函数调用机制
当通过基类对象的指针调用函数时,会发生以下一系列事件:
1. 使用被指向对象中的虚表指针找到该类虚表的起始位置。
2. 通常通过偏移量在虚表中找到要调用的函数的条目。
3. 通过虚表中的函数指针间接调用函数。这种间接调用比非虚函数的直接调用稍慢,因此每次虚函数调用都会有一些开销。
不过,调用虚函数的开销很小,无需过分担忧。每个对象多占用的几个字节和稍慢的函数调用,是为多态性带来的强大功能和灵活性所付出的小代价。这也解释了为什么具有虚函数的对象比没有虚函数的等效对象更大。
2. 纯虚函数
在某些情况下,需要一个基类,有多个派生类从该基类派生,并且有一个虚函数在每个派生类中被重新定义,但该函数在基类中没有有意义的定义。例如,定义一个基类 Shape ,从它派生出定义特定形状的类,如 Circle 、 Ellipse 、 Rectangle 、 Curve 等。 Shape 类可能包含一个虚函数 draw() ,用于调用派生类对象绘制特定形状,但 Shape 类本身没有 draw() 函数的有意义实现,因为它没有定义任何可以绘制的东西。这就是纯虚函数的用武之地。
纯虚函数的目的是使派生类版本的函数能够被多态调用。要声明一个纯虚函数而不是有定义的“普通”虚函数,使用相同的语法,但在类内的函数声明后添加
超级会员免费看
订阅专栏 解锁全文
936

被折叠的 条评论
为什么被折叠?



