3

見てくれてありがとう。

私はそれに慣れるために C++ のソフトウェア パターンを調べていますが、インターフェイス ベースのプログラミングの問題、つまりダイヤモンドの問題を抱えています。

状況は次のとおりです。それぞれ独自のインターフェイス クラスを持つクラスWidgetが派生するクラスがあります。クラスにはメソッドがあり、Buttonクラスにはのメソッドとメソッドがあります。WidgetfooButtonWidgetfoobar

#include <iostream>
using namespace std;

class IWidget{
public:
    virtual void foo() = 0;
    virtual ~IWidget() {}
};

class IButton : virtual public IWidget{
public:
    virtual void bar() = 0;
    virtual ~IButton() {}
};

class CWidget : virtual public IWidget{
public:
    void foo(){ cout << "foo"; }
};

class CButton : public CWidget, public IButton{
public:
    void bar() { cout << "bar"; }
};


int main(){
    CButton button;
    button.foo();
    button.bar();
}

したがって、問題は CButton が だけでなく も継承していたことですCWidget(fooこれIButtonは純粋な仮想です)。しかし、IButtonおよびで仮想継承を使用することによりCWidget、これはコンパイルおよび実行され、「foobar」が画面に出力されます。

ただし、問題は、Eclipse がCButton buttonエラーとしてフラグを立てていることです。

The type 'CButton' must implement the inherited pure virtual method 'IWidget::foo'

すべてが期待どおりに実行されるため、これは奇妙です。これは Eclipse の構文チェッカーの問題ですか? この問題には他の解決策があることを知っているので、Eclipse は私の方法が標準ではないことを伝えようとしているのかもしれません。

どんな助けでも大歓迎です。

編集: OSX Lion で gcc 4.2 を使用しており、c++ には最新バージョンの Eclipse を使用しています。

4

1 に答える 1

0

それは私には標準に見えます。私のリファレンスは、Stroustrupの「TheC ++ Programming Language」、第3版、ダイヤモンドの継承に関する15.2.5.1です。彼は次のように書いています。「2つの異なるクラスが仮想ベースからの異なる仮想関数をオーバーライドする可能性があります。そのようにして、いくつかの派生クラスが仮想ベースクラスによって提示されるインターフェイスに実装を提供できます。」彼の例はあなたの例と同じ構造です。これは、仮想継承の目的の大きな部分です。

于 2012-07-23T11:34:48.767 に答える