2

私はこの問題に何度も巻き込まれました:

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

関数が純粋仮想の場合、コンパイラーはエラーをキャッチします。しかし、そうでない場合、これは追跡するのにひどいバグになる可能性があります。問題の一部は、関数名が長すぎる可能性があることです。しかし、私はまだ疑問に思っています、これらのバグを早く見る方法はありますか?

4

3 に答える 3

2

1つの可能性は、実装されたほとんど使用されていない純粋仮想関数です。

virtual int longDescriptiveName() = 0
{
    return 0; 
}

これにより、派生クラスはそれをオーバーライドします。次に、その動作のみが必要な場合は、基本クラスの実装を単独で呼び出すことができます。

また、継承階層がマルチレイヤーではなくフラットであることを確認する必要があります。これは、継承がレイヤーに積み重なることなく十分に壊れやすいため、とにかく一般的には適切です。

于 2010-02-09T22:08:27.667 に答える
1

Microsoft Visual C ++ 2005以降でコンパイルする場合、次のように記述できる非標準の拡張機能があります。

virtual int longDescriptveName() override { return 1; }

そしてコンパイラは文句を言うでしょう。他のコンパイラーでもコンパイルする場合は、動作を制御できるように#defineを作成するのが賢明でしょう。

于 2010-02-09T22:20:15.410 に答える
0

古いネクロの質問ですが、1つの良い方法は、クラスの使用を開始する前に、ユニットテストを使用して正式にテストするか、より非公式にテストすることです。言い換えれば、それを早い段階で確認してください。

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);

クラスを使用するコードをさらに10,000行書く前に。

于 2013-10-26T14:27:11.817 に答える