如何优化基类实现中对派生类虚方法的调用?
问题:虚函数调用优化与基类实现复用
先看我定义的抽象基类和派生类:
class base { public: virtual void pure_func() = 0; // 调用虚函数的通用方法 virtual void virt_func() { pure_func(); } }; class derived : public base { public: // 标记为final的实现 void pure_func() final { // ... 具体逻辑 ... } };
我想知道:能不能在继承virt_func实现的同时,让通过derived类指针调用virt_func时,里面对pure_func的调用不需要动态分派?
我知道编译器在静态类型明确时会跳过虚表查找,但virt_func的实现只在基类里写了一次,我觉得这肯定会触发虚调用。我想找一种方式,让每个派生类都能复用基类的方法实现,同时让优化编译器能针对性处理(比如因为pure_func被final修饰,直接跳过虚表查找)。
我试过几种方案,但都因为各种问题放弃了:
- 用宏定义“标准”实现:可读性差,而且宏没法访问基类的保护/私有成员
- 把基类实现复制粘贴到每个派生类:可维护性极差,同样没法访问基类的保护/私有成员
- 写“实现类”然后继承:只是把问题转移了,没从根本解决
- 静态多态/静态分派:会失去运行时多态的优势,因为派生类没有公共基类
- 组合模式(写独立的共享实现类):直觉上可行,但会遇到和宏、静态多态类似的问题
这个问题主要是出于学习目的,但来自我写热点代码时的场景:一个基类缓冲区类用了这种模式,我想尽可能避免不必要的虚调用。补充一下,我场景里基类的所有实现函数都很小,但数量很多。
内容的提问来源于stack exchange,提问作者Cartier
相关产品推荐
相关产品推荐

