考虑下面的类层次结构:
我的理解是在
考虑这两个
struct Animal { virtual ~Animal(); };
struct Cat : virtual Animal {};
struct Dog final : virtual Animal {};
我的理解是在
class Dog
上加上 final
可以确保没有人可以创建一个继承自 Dog
的类,这也意味着没有人可以创建一个同时 IS-A Dog
和 IS-A Cat
的类。考虑这两个
dynamic_cast
:Dog *to_final(Cat *c) {
return dynamic_cast<Dog*>(c);
}
Cat *from_final(Dog *d) {
return dynamic_cast<Cat*>(d);
}
GCC、ICC和MSVC忽略final
限定符并生成对__dynamic_cast
的调用;这很不幸但也不足为奇。
令我惊讶的是,Clang和Zapcc都会生成from_final
(“始终返回nullptr”)的最佳代码,但对于to_final
则会生成对__dynamic_cast
的调用。
在这个编译器中,是否真的错过了优化机会(显然有人花费了一些精力来尊重转换中的final
限定符),还是由于某些微妙的原因而在这种情况下无法进行优化,这仍然让我困惑?