关于使用内联实现重写纯虚函数的若干技术疑问
class Base { virtual void foo() = 0; }; class Derived : public Base { inline void foo() { /* Implementation */} };
1. 纯虚函数的重写实现是否可以使用内联?
完全可以。C++标准没有禁止内联重写纯虚函数的实现,只要代码符合内联函数的基本规则(比如函数定义在调用点可见),这种写法是合法的。
2. 这种做法是否属于良好实践?
分场景判断:
- 如果
Derived::foo的调用以非虚调用为主(比如直接用Derived对象调用,或通过Derived*/Derived&明确调用),内联能消除函数调用开销,是合理的优化手段。 - 如果主要是通过
Base*/Base&做虚调用,内联基本没用——虚调用是运行时通过虚表查找函数地址,编译器无法在编译期确定具体调用版本,自然没法做内联优化。这种场景下加内联不仅没收益,还可能让编译器生成冗余的非内联实例(供虚调用使用),徒增代码体积。
3. 该内联函数是否会被放入虚表(vtable)?
会的。只要是虚函数(不管是否内联、是否重写纯虚函数),都会在对应类的虚表中占据一个条目,存储函数地址。哪怕函数标记为内联,当需要虚调用时,编译器会生成该函数的非内联实例,并把实例地址放进虚表——毕竟虚调用需要固定的内存地址来跳转。
4. 类内定义本身已暗示内联,inline关键字是否完全冗余?
是的。在类内部直接定义成员函数(无论是否为虚函数、是否重写纯虚函数),编译器会自动将其视为内联候选函数,和显式加inline关键字的效果完全一致。这里的inline纯粹是冗余写法,不违法但毫无必要。
内容的提问来源于stack exchange,提问作者corsel
相关产品推荐
相关产品推荐

