在发布任何内容之前,我通常会尝试在这里找到答案,但我甚至不确定如何制定我的问题。
所以这就是我想要做的......我想定义一个基本接口和一个派生接口。然后,我想用额外的变量和方法实现Base Interface。最后,我想实现一个Derived类,来自已实现的Base接口,也来自Derived Interface。我不了解你,但我的头疼。
如果我执行下面的操作,我会在DerivedFloat代码下获得不明确的定义,因为该代码“看到”来自IBase的GetBaseValue方法,通过IDerivedFloat继承,以及从Base继承的GetBaseValue。
当然,必须有一种方法可以派生一个使用Base实现的扩展功能的类,并确保它实现所需的IDerivedFloat方法。
现在......这是一个虚拟的例子来展示我在概念上试图实现的目标。这不是一个真实的例子。
template <typename VALUE_TYPE>
class IBase
{
public:
virtual VALUE_TYPE GetBaseValue() const = 0;
};
class IDerivedFloat : public IBase<FLOAT>
{
public:
virtual void SetBaseValue(const FLOAT & value) = 0;
};
// Implementation of Base
template <typename VALUE_TYPE>
class Base : public IBase<VALUE_TYPE>
{
public:
VALUE_TYPE GetBaseValue() const { return m_BaseValue; }
protected:
VALUE_TYPE m_BaseValue;
}
// Uses expanded Base AND implements IDerivedFloat
class DerivedFloat : public Base<FLOAT>, public IDerivedFloat
{
public:
void SetBaseValue(const FLOAT & value) { m_BaseValue = value };
}
答案 0 :(得分:3)
您可以使用virtual inheritance来解决此问题:
class IDerivedFloat : virtual IBase<FLOAT>
{
public:
virtual void SetBaseValue(const FLOAT & value) = 0;
};
template <typename VALUE_TYPE>
class Base : virtual IBase<VALUE_TYPE>
{
public:
VALUE_TYPE GetBaseValue() const { return m_BaseValue; }
protected:
VALUE_TYPE m_BaseValue;
}
使用虚拟继承为派生类提供基类成员的一个实例,而不是每次在类层次结构中存在一个实例。
答案 1 :(得分:0)
多重继承是一个问题,正是因为您遇到了歧义问题,但有很多方法可以解决这个问题。您必须通过使用超级名称和双冒号引导函数调用,明确告诉编译器您调用不明确函数的超级函数。
例:
- C继承自A和B.
- A和B都有add()函数
- 在C中,你必须说A :: add()或B :: add()来告诉编译器使用哪一个。
链接了解详情和更完整的实施:http://www.cprogramming.com/tutorial/multiple_inheritance.html