1

c++/cli を使用してラッパーを作成し、c++ ライブラリと C# グラフィック インターフェイスをやり取りしたいと考えています。

私の問題は、c++/cli で継承を実装したいときに発生します: アイデア: 抽象クラス B は抽象クラス A から継承します クラス C は抽象クラス B から継承します

public ref class A_Wrapper abstract
{
public:
A_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
};       
public ref class B_Wrapper abstract: public A_Wrapper 
{ 
private:
B * nativeLS;
public:
B_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
virtual B * getNative();
};

私が見つけたエラーは次のとおりです: エラー: 'new' または 'override' が必要です。この宣言は関数 A:solve と一致するためです

double solve(OtherWrapper ^) override;使用する代わりに仮想を使用virtual double solve(OtherWrapper ^) =0; し、.cpp ファイルにメンバー関数を実装すると、機能します。B_Wrapper を抽象化して、実装する必要がないようにしたいB_Wrapper::solve(..)。私は何が欠けていますか?

私がはっきりしていて、誰かが私を助けてくれることを願っています。前もって感謝します。

4

3 に答える 3

1

C++/CLI コンパイラは、あなたが足を踏み出すのを止めようとしています。B_Wrapper クラスには、solve() という名前の2 つのメソッドがあります。A_Wrapper から継承したものと追加したもの。追加されたものは、継承されたものを隠します。

このシナリオは、パラメーターを追加して仮想メソッドを変更するときに発生する、C++ の非常に一般的なバグです。このようなメソッドは、基本メソッドも編集されていない場合、基本メソッドをオーバーライドしなくなりました。診断するのはかなり難しい。C++/CLI 言語は、それについて何かをするのが早かったです。その後、 overrides修飾子が追加されて C++11 に採用されました。基本メソッドをオーバーライドする場合はオーバーライドを使用し、非表示が意図されている場合は明示的にnewを使用する必要があります。

抽象メソッドを実際にオーバーライドせず、継承されたメソッドを非表示にする考えられる理由がないため、どちらもここでは意図されていない可能性が非常に高いです。B_Wrapper の solve() メソッド宣言を削除するだけで、既に A_Wrapper から継承されています。

于 2013-09-25T15:06:51.533 に答える