オーバーライドされたメソッドの前にvirtualキーワードを付けるのか、それとも元の基本クラスでのみ接頭辞を付けるのかについて、同僚と話し合っています。
私はすべての仮想メソッド(つまり、vtableルックアップを含むメソッド)の前にvirtualキーワードを付ける傾向があります。私の理論的根拠は3つあります。
C ++にオーバーライドキーワードがない場合、仮想キーワードの存在は、少なくともメソッドがルックアップを含み、理論的にはさらなる特殊化によってオーバーライドされるか、より高い基本クラスへのポインターを介して呼び出される可能性があることを通知します。
このスタイルを一貫して使用するということは、仮想キーワードのないメソッド(少なくともコード内)を見ると、最初はそれがベースから派生したものでも、サブクラスに特化したものでもないと想定できることを意味します。
何らかのエラーによって仮想がIFooから削除された場合でも、すべての子は引き続き機能します(CFooSpecialization :: DoBarは、単に非表示にするのではなく、CFooBase :: DoBarをオーバーライドします)。
私が理解したように、この慣行に反対する議論は、「しかし、その方法は仮想的ではない」(これは無効であり、仮想性の誤解から生まれたと私は信じている)、そして「仮想キーワードを見ると、誰かがそれから派生していて、それらを探しに行くことを意味します。」
架空のクラスは複数のファイルに分散している可能性があり、いくつかの専門分野があります。
class IFoo {
public:
virtual void DoBar() = 0;
void DoBaz();
};
class CFooBase : public IFoo {
public:
virtual void DoBar(); // Default implementation
void DoZap();
};
class CFooSpecialization : public CFooBase {
public:
virtual void DoBar(); // Specialized implementation
};
様式的には、2つの派生クラスから仮想キーワードを削除しますか?もしそうなら、なぜですか?ここでStackOverflowの考えは何ですか?