次のような構造の 3 つのクラスがあります。
#include <iostream>
using namespace std;
class Keyword
{
public:
virtual float GetValue() = 0;
};
class CharacterKeyword : public Keyword
{
public:
virtual float GetValue(){return _value;}
private:
float _value;
};
class MeasurementKeyword : public Keyword
{
public:
virtual float GetValue(){return _value;}
private:
float _value;
};
class AddressType : public CharacterKeyword, public MeasurementKeyword
{
private:
float address;
float addresExt;
};
int main()
{
AddressType *a = new AddressType();
a->GetValue();
return 0;
}
私は以下を取得しています:
In function ‘int main()’:
error: request for member ‘GetValue’ is ambiguous
error: candidates are: virtual float Keyword::GetValue()
error: virtual float MeasurementKeyword::GetValue()
error: virtual float CharacterKeyword::GetValue()
私は多重継承についていくつか読んだことがありますが、それには多くの落とし穴があることを知っています - これはそのうちの1つです。クラス構造をこのようにする必要があるので、テンプレートを使用してこれを修正できる方法があるかどうか疑問に思っていましたか?
更新
あなたのコメントを読んだ後、私の最初の考えAddressType
はCharacterKeyword
、. そして、更新されたコードでそれをそのまま使用します。または、必要なメンバーの名前空間を指定することもできます。テンプレート化された方法はまだ答えとして言及されていないので、それは悪い修正ですか? 必要なメンバーの名前空間を指定するだけでよいですか?AddressType
MeasurementKeyword
AddressType
template <class T>
class AddressType : public T
{
private:
float address;
float addresExt;
};
int main()
{
AddressType<MeasurementKeyword> *a = new AddressType<MeasurementKeyword>();
a->GetValue();
return 0;
}