スペルミスのある仮想関数の検出
-
19-09-2019 - |
質問
私はこの問題に何度も遭遇しました。
class A{
public:
virtual ~A() {}
virtual int longDescriptiveName(){ return 0; }
};
class B: public A{
public:
virtual int longDescriptveName(){ return 1; } // Oops
};
関数が純粋仮想関数の場合、コンパイラはエラーを捕捉します。しかし、そうでない場合、これは追跡するのが難しいバグになる可能性があります。問題の一部は、関数名が長すぎる可能性があることです。しかし、それでも疑問に思うのですが、これらのバグをより早く確認する方法はあるのでしょうか?
解決
可能性の 1 つは、ほとんど使用されていない実装を伴う純粋仮想関数です。
virtual int longDescriptiveName() = 0
{
return 0;
}
これにより、派生クラスが強制的にオーバーライドされます。その動作のみが必要な場合は、基本クラスの実装を単独で呼び出すことができます。
また、継承階層が多層ではなくフラットであることを確認する必要があります。継承は層を重ねることなく十分に脆弱であるため、一般的にはこれで十分です。
他のヒント
あなたは、Microsoft Visual C ++ 2005以降でコンパイルする場合は、
は、を非標準の拡張機能があるのあなたが書くことができます:
virtual int longDescriptveName() override { return 1; }
とコンパイラが文句を言います。あなたが他のコンパイラでもコンパイルした場合は、動作を制御することができるように#defineを作るために、その、おそらくスマート。
旧necro'd質問が、一つの良い方法は、あなたがあなたのクラスの使用を開始する前に、いずれかの正式ユニットテストと、以上の非公式、早期にテストすることです。言い換えれば、その上で早期に確認します:
A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);
の前に、あなたのクラスを使用するコードの万行以上の書き込みます。
所属していません StackOverflow