我最近决定使用非虚拟接口习惯用法 (NVI) 来设计 C++ 中的接口,主要是为了使用具有默认值的参数(从而避免由于默认参数是静态绑定的事实而引起的问题)。
我为我的班级带来了一个相当微不足道的声明,如下所示:
class Interface{
public:
void func(Parameter p = 0);
virtual ~Interface();
private:
virtual void doFunc(Parameter p)=0;
};
void Interface::func(Parameter p){ doFunc(p); }
Interface::~Interface() {}
我知道在标头中提供函数体会自动将函数标记为内联候选函数(尽管我不知道将定义放在类之外是否会阻止这种情况)。我也知道虚函数没有内联,原因很明显(我们不知道在运行时会调用哪个函数,所以我们显然不能用函数体替换调用)。
那么,在这种情况下,是否会func()
被标记为内联候选?它不是虚函数,但仍然调用虚函数。它是否可以内联?
额外的问题:值得吗?正文只包含一个语句。
请注意,这个问题非常适合学习它,而不是到处搜索优化。我知道这个函数只会被调用几次(好吧,就目前而言,最好谨慎对待程序的发展方式),并且内联将是相当多余的,而不是我程序性能的主要关注点。
谢谢 !