見てくれてありがとう。
私はそれに慣れるために C++ のソフトウェア パターンを調べていますが、インターフェイス ベースのプログラミングの問題、つまりダイヤモンドの問題を抱えています。
状況は次のとおりです。それぞれ独自のインターフェイス クラスを持つクラスWidget
が派生するクラスがあります。クラスにはメソッドがあり、Button
クラスにはのメソッドとメソッドがあります。Widget
foo
Button
Widget
foo
bar
#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 を使用しています。