次のクラス継承を持つ既存のプロジェクトがあります
class Base
{
public:
Base();
virtual ~Base();
void SetID(unsigned short);
virtual inline unsigned short GetID();
protected:
unsigned short id;
};
class Generic : public Base {
public:
Generic(const char *in_name);
const char* GetName() { return name; }
protected:
char name[30];
};
class Actor : public Generic
{
public:
Actor(const char *in_name);
~Actor();
void DoSomething(const char* str);
};
機能を使用するために実装する必要があるインターフェイスを提供するために、別のプロジェクトを作成しました。このプロジェクトを他の実装に再利用する予定です。
class MyInterface
{
public:
virtual ~MyInterface() {}
// Our methods that need to implemented
virtual const char* GetName() = 0;
virtual void DoSomething(const char* str) = 0;
virtual unsigned short GetID() = 0;
};
今、私は単にこれを私のアクタークラスで使用したかったのです。例えば、クラス Actor : public Generic、public MyInterface
ただし、コンパイルに失敗します
'const char *MyInterface::GetName(void)' : is abstract see declaration of 'MyInterface::GetName'
'unsigned short MyInterface::GetID(void)' : is abstract see declaration of 'MyInterface::GetID'
error C2385: ambiguous access of 'GetName'
could be the 'GetName' in base 'Generic'
or could be the 'GetName' in base 'MyInterface'
問題はおそらく、GetName が既に Generic に実装されており、GetID が既に Base に実装されていることです。そのため、子クラスで Actor を実装することはできません。これは、コンパイラがこれらのメソッドの実装が既に存在することを認識できるほど賢くないためです。
ただし、回避策を見つけました-しかし、これにはアクタークラスのヘッダーを拡張する必要がありますが、これは良いことではありません-別のアプローチがあるかどうかを知りたかった-私の修正は
class Actor : public Generic, public MyInterface
{
public:
Actor(const char *in_name);
~Actor();
void DoSomething(const char* str);
const char* GetName() { return Generic::GetName(); };
inline unsigned short GetID() { return Base::GetID(); };
};
これは明らかに varargs メソッドでは機能せず、既存のメソッドを実装して親に再度委任する必要があります-より良い解決策はありますか?
編集明確にするために-クラスbase、generic、およびactorは、他の人が管理する別のプロジェクトに存在します。これらへの変更は非常に制限する必要があります。- 静的 LIB を作成する別のプロジェクトを作成しました - これらの関数をアクター クラスと組み合わせて使用するために - 自分のプロジェクトに依存しないようにインターフェイスを作成し、他のプロジェクトに再利用可能なライブラリを提供します。このインターフェースを実装する必要があります。