【发布时间】:2013-08-10 11:23:13
【问题描述】:
我有三个这样的类:
#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 ambiguouserror: candidates are: virtual float Keyword::GetValue()error: virtual float MeasurementKeyword::GetValue()error: virtual float CharacterKeyword::GetValue()
我对多重继承做了一些阅读,我知道它有很多陷阱——这就是其中之一。我需要我的类结构是这样的,所以我想知道是否有一种方法可以使用模板来解决这个问题?
更新
在阅读了您的 cmets 之后,我最初的想法是,也许我可以通过模板化 AddressType 在 AddressType(即 CharacterKeyword)和 AddressType(即 MeasurementKeyword)之间划定界限。并在更新的代码中使用它。 或我可以指定我想要的成员的命名空间。由于尚未提及模板化方式作为答案,这是一个不好的解决方法吗?我应该只指定我想要的成员的命名空间吗?
template <class T>
class AddressType : public T
{
private:
float address;
float addresExt;
};
int main()
{
AddressType<MeasurementKeyword> *a = new AddressType<MeasurementKeyword>();
a->GetValue();
return 0;
}
【问题讨论】:
-
取决于你想如何解决这个问题。你想在这里发生什么?
-
@KarthikT 这就是我给他两种方式的原因;)
-
@aaronman 是的,没有错您的解决方案,但不确定他想用模板完成什么..
-
@KarthikT 实际上我去掉了标题中的模板,因为它似乎与它们无关
-
larry 正如您在 cmets 中看到的那样,模板在这里确实不相关,所以我删除了它们,我的答案或底部的答案是您解决歧义的方法
标签: c++ virtual-inheritance diamond-problem