Java、C#、D などの言語では、final
クラスsealed
はリーフ クラス (他のクラスが継承しないクラス) であることが保証されています。これにより、コンパイラは、コンパイル時の型がfinal
orであるオブジェクトへのメソッド呼び出しを非仮想化することができますsealed
。
final
C++ にはorsealed
キーワードがありません。継承階層のリーフであるクラスの非仮想化に関して、その動作をシミュレートする方法はありますか?
Java、C#、D などの言語では、final
クラスsealed
はリーフ クラス (他のクラスが継承しないクラス) であることが保証されています。これにより、コンパイラは、コンパイル時の型がfinal
orであるオブジェクトへのメソッド呼び出しを非仮想化することができますsealed
。
final
C++ にはorsealed
キーワードがありません。継承階層のリーフであるクラスの非仮想化に関して、その動作をシミュレートする方法はありますか?
C++11 には がありますがfinal
、これはキーワードではなく特別な識別子です。「非仮想化」の目的には役立ちません。クラスが派生したり、派生クラスで単一のメソッドがオーバーライドされたりするのを防ぐだけです。
The only way to do such a thing in C++ is to make sure that the compiler know the static and dynamic types are the same and let the optimizer realize the virtual call isn't needed. In other words, access the object by value and not through a reference or pointer. This even works on non-leaf types!