C++ 从接口和实现继承C++;

C++ 从接口和实现继承C++;,c++,inheritance,interface,C++,Inheritance,Interface,在我发布任何东西之前,我通常会在这里找到答案,但我甚至不知道如何表述我的问题 这就是我想做的。。。我想定义一个基本接口和一个派生接口。然后,我想用额外的变量和方法实现基本接口。最后,我想实现一个派生类,既可以从实现的基接口实现,也可以从派生接口实现。我不知道你的情况,但我的头很痛 如果我像下面这样做,我会在DerivedFloat代码下得到不明确的定义,因为该代码“看到”来自IBase的GetBaseValue方法(通过IDerivedFloat继承),以及从Base继承的GetBaseValu

在我发布任何东西之前,我通常会在这里找到答案,但我甚至不知道如何表述我的问题

这就是我想做的。。。我想定义一个基本接口和一个派生接口。然后,我想用额外的变量和方法实现基本接口。最后,我想实现一个派生类,既可以从实现的基接口实现,也可以从派生接口实现。我不知道你的情况,但我的头很痛

如果我像下面这样做,我会在DerivedFloat代码下得到不明确的定义,因为该代码“看到”来自IBase的GetBaseValue方法(通过IDerivedFloat继承),以及从Base继承的GetBaseValue

当然,必须有一种方法来派生一个使用基本实现的扩展特性的类,并确保它实现所需的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 };
}
模板
IBase类
{
公众:
虚拟值\u类型GetBaseValue()常量=0;
};
类IDerivedFloat:公共IBase
{
公众:
虚拟void SetBaseValue(常量浮点和值)=0;
};
//基础设施的实施
模板
类库:公共IBase
{
公众:
VALUE_TYPE GetBaseValue()常量{return m_BaseValue;}
受保护的:
值\类型m \基本值;
}
//使用扩展的基础并实现IDerivedFloat
类派生float:public Base,public IDerivedFloat
{
公众:
void SetBaseValue(const FLOAT&value){m_BaseValue=value};
}

多重继承之所以成为一个问题,正是因为您遇到了模棱两可的问题,但有一些方法可以绕过它。您必须显式地告诉编译器您从哪个super调用不明确的函数,方法是使用super的名称和双冒号引导函数调用

示例:
-C继承自A和B。
-A和B都有add()函数。
-在C语言中,必须说A::add()或B::add()来告诉编译器使用哪一个


有关详细信息和更完整实现的链接:

多重继承是一个问题,正是因为您遇到了模棱两可的问题,但是有办法解决它。您必须显式地告诉编译器您从哪个super调用不明确的函数,方法是使用super的名称和双冒号引导函数调用

示例:
-C继承自A和B。
-A和B都有add()函数。
-在C语言中,必须说A::add()或B::add()来告诉编译器使用哪一个

有关详细信息和更完整实施的链接:

您可以使用此链接解决此问题:

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;
}
class-IDerivedFloat:virtualibase
{
公众:
虚拟void SetBaseValue(常量浮点和值)=0;
};
模板
类库:虚拟IBase
{
公众:
VALUE_TYPE GetBaseValue()常量{return m_BaseValue;}
受保护的:
值\类型m \基本值;
}
使用虚拟继承为派生类提供基类成员的一个实例,而不是每次存在于类层次结构中时都提供一个实例。

您可以使用来解决此问题:

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;
}
class-IDerivedFloat:virtualibase
{
公众:
虚拟void SetBaseValue(常量浮点和值)=0;
};
模板
类库:虚拟IBase
{
公众:
VALUE_TYPE GetBaseValue()常量{return m_BaseValue;}
受保护的:
值\类型m \基本值;
}

使用虚拟继承给派生类提供基类成员的一个实例,而不是在类层次结构中每次存在的时候。在我发布任何东西之前,我通常会尝试在这里找到答案。所以,您没有找到“钻石继承”或在任何搜索中?不是C++专家。我第一次听说钻石遗产这个词。至于“虚拟继承”,我有。但很明显,从你的评论来看,我不知道如何利用这些信息来解决我的问题。你点击了我评论中的链接了吗?它基本上是你接受的答案的一个副本。我通常在我发布任何东西之前尝试找到答案。所以你没有找到“钻石遗产”或者你的任何搜索?不是C++专家。我第一次听说钻石遗产这个词。至于“虚拟继承”,我有。但很明显,从你的评论来看,我不知道如何利用这些信息来解决我的问题。你点击了我评论中的链接了吗?这基本上是你接受的答案的副本。谢谢。我真的试过了!但让我感到不安的是派生类将携带这两个定义。。。这是我试图避免的。这让我得出结论,我可能没有以正确的方式处理这个问题,也许??如果您试图停止使用这两个函数,我唯一的想法可能是在子函数本身中使用另一个函数覆盖它们,但这并不能消除父函数,只是覆盖了它们。他们仍然可以接近。我不确定你只能继承一个类的一部分,你必须要么继承全部,要么什么都不继承。再次感谢你的帮助前进党。谢谢。我真的试过了!但让我感到不安的是派生类将携带这两个定义。。。这是我试图避免的。这让我得出结论,我可能没有以正确的方式处理这个问题,也许??如果您试图停止使用这两个函数,我唯一的想法可能是在子函数本身中使用另一个函数覆盖它们,但这并不能消除父函数,只是覆盖了它们。他们仍然可以接近。我不确定你只能继承一个类的一部分,你必须要么继承全部,要么什么都不继承。再次感谢你的帮助前进党。谢谢安迪!看起来它做了我想做的事。。。你的回答比“嗯,你没有研究过虚拟继承吗?”)更能说明问题:谢谢安迪!这看起来像是我想要的