次があるとします。
class Base
{
__forceinline virtual int A() {return 1;}
}
class Derived: public Base
{
int A()
{
return 2;
}
}
派生クラスの関数 A は、明示的に記述しなくても仮想です。派生クラスの関数 A も、明示的に記述せずに __forceinlined になりますか?
まず、仮想的に呼び出される関数はインライン化できません。コンパイラは、呼び出す関数を知るために、最初に vtable ポインターに到達する必要があります。マークされたすべての関数virtual
が仮想的に呼び出されるわけではありません - それらはインライン化できます。
その後、__forceinline
派生クラスの実装には反映されません。これは、関数ごとに有効な非標準のコンパイラ固有のキーワードです。したがって、インライン化を強制したい場合は、派生クラス関数でキーワードを再度適用する必要があります。繰り返しますが、すべての呼び出しがインライン化されることは保証されません。
これは、使用しているコンパイラで文書化する必要がありますが、私にとっては、強制されているかどうかにかかわらず、「インライン性」は継承の契約の一部ではないものです。いいえ、そうすべきではありません。