2

この質問のフォローアップとして: 純粋な仮想インターフェイス クラスを作成し、実装クラスをヘッダーとソース ファイルに分割すると、次のようになります。

インターフェース:

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

実装クラス、ヘッダー:

class Child : public IDemo
{
    public:
       virtual void OverrideMe();
};

実装クラス、ソース:

void Child::OverrideMe() 
{
    //doStuff
}

そのため、インターフェイスで宣言されたメソッドの名前を 3 回入力する必要があります。これは面倒なだけでなく、混乱を招きます。これを行うより良い方法はありますか?

4

2 に答える 2

4

これを回避する方法はありません (他の人が既に提案したように、ヘッダー ファイルに定義を記述しない限り、Botz3000 も提案したように、これを行わないでください)。

それがこれを行う方法です。


あなたのコメントに基づいて、私は答えを書くことにしました:

自分:

そして、何がそんなに混乱しているのか

あなた:

誰かがヘッダーを調べた場合、このメソッド宣言が実際に基本クラスから継承されていることをどのように知ることができますか?

方法は 2 つあります。次のようにコメントを残してください。

/*
 * This overrides Base::OverrideMe
 */
virtual void OverrideMe();

ほとんどの編集者は、マウスカーソルを上に置くと、このコメントを表示します。

これを行うもう 1 つの方法は、関数の後にキーワードをC++11追加して を使用することです。override

class Child : public IDemo
{
    public:
       virtual void OverrideMe() override;
};

これは、他の場合にも役立つ可能性があります。C++11 に関する wiki 記事の次の部分を参照してください。override

参照: 'override' キーワードはオーバーライドされた仮想メソッドの単なるチェックですか?

于 2013-03-28T08:57:17.370 に答える
2

いいえ、それを回避する良い方法はありません。
メソッドはコントラクトの一部であるため、インターフェイスはメソッドを指定する必要があります。
クラスがそれをオーバーライドすることを示すために、ヘッダーはメソッドを指定する必要があります。
実装がどのメソッドに属しているかをコンパイラが認識できるように、ソース ファイルでメソッドを指定する必要があります。これは紛らわしいとは思いません。

発生を 2 つに減らす唯一の方法は、クラスのヘッダーにメソッドを実装することですが、私はこれを強く思いとどまらせます。

于 2013-03-28T08:49:42.800 に答える