A * a = new B();
a->foo();
假设 B 派生 A 并且 foo() 是一个虚函数。这个例子很常见,问题是在某些地方据说编译器不会尝试内联它,而在其他地方则完全相反。
我个人看不出这个调用不能被内联的原因,因为在编译时很容易判断哪个函数被调用。
编辑1:我知道“一般情况”,也知道编译器需要很多因素来决定是否内联。如果我问编译器是否可以内联这个特定的调用,这个问题可能会更好。
我问这个的原因是 这个 C++ FAQ中的这个特殊引用,它说:
当通过指针或引用引用对象时,不能内联对虚函数的调用,因为调用必须动态解析。