繁体   English   中英

从接口和实现C ++继承

[英]Inheriting from both an interface and an implementation C++

在发布任何内容之前,我通常会尝试在此处找到答案,但是我什至不知道如何提出问题。

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

如果执行以下操作,则会在DerivedFloat代码下获得歧义定义,因为该代码“看到”了IBase的GetBaseValue方法(继承自IDerivedFloat)以及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 };
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM