继承接口和实现C ++

时间:2016-06-21 16:37:09

标签: c++ inheritance interface

在发布任何内容之前,我通常会尝试在这里找到答案,但我甚至不确定如何制定我的问题。

所以这就是我想要做的......我想定义一个基本接口和一个派生接口。然后,我想用额外的变量和方法实现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 };
}

2 个答案:

答案 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