从接口和实现C 继承

Inheriting from both an interface and an implementation C++

本文关键字:继承 实现 接口      更新时间:2023-10-16

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

所以这是我想做的...我想定义一个基本接口和一个派生的接口。然后,我想通过额外的变量和方法来实现基本接口。最后,我想从实现的基本接口,但也从派生的接口实现了一个派生类。我不认识你,但是我的头很痛。

如果我在下面做类似的事情,我会在派生的Float代码下获得模棱两可的定义,因为该代码从IBase中"看到"了getBaseValue方法,它是通过IDEREVEREVEREVERVLOAT继承的,以及从基础上继承的GetBaseValue。

当然,必须有一种方法来得出使用基本实现的扩展功能的类,并确保它实现了所需的IDEREVEREVEREDFLOAT方法。

现在...这是一个虚拟示例,可以显示我在概念上尝试实现的目标。这不是现实生活中的例子。

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 };
}

您可以使用虚拟继承解决此问题:

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;
}

使用虚拟继承给出了基类成员的一个类实例,而不是从每次存在于类层次结构中的每个实例。

多重继承正是由于您遇到的歧义问题,但是有一些方法可以解决它。您必须明确地告诉编译器,通过用超级名称和双重船体领导函数调用来调用哪个超级函数。

示例:
-c继承A和B。
-a和b都具有add()函数。
- 在C中,您必须说A :: add()或B :: add()才能告诉编译器要使用哪个。

链接以获取详细信息和更完整的实现:http://www.cprogramming.com/tutorial/multiple_inheritance.html