假设我有以下代码:
template <class Derived>
class Base {
public:
virtual void foo_impl() = 0;
void foo() {
static_cast<Derived*>(this)->foo_impl(); //A
(*static_cast<Derived*>(this)).foo_impl(); //B
}
};
class Derived : public Base<Derived> {
private:
void foo_impl() {
bar();
}
};
几个问题:
A行会产生虚函数调用吗?尽管我在互联网上可以找到的大部分内容都建议以这种方式进行操作,但对我来说,考虑到指向 Derived 的指针实际上仍可能指向 Derived2 类型的对象,我看不到编译器如何进行静态调度:公共派生。
B 行是否解决了我在上一点中提出的问题(如果适用)?考虑到现在调用不再在指针上,因此使用 *. 将避免虚函数调用。但是如果编译器将取消引用的强制转换视为引用类型,它仍然可以生成虚函数调用......在这种情况下,解决方法是什么?
将 C++11 final 关键字添加到 foo_impl() 是否会改变编译器在任一(或任何其他相关)情况下的行为方式?