我搜索了堆栈溢出,但没有找到能完全回答我问题的东西。我有一个仅包含纯虚函数的接口(interface)类,我想由该类派生的类来实现。

我有一个称为 BaseInterface 的接口(interface),该接口(interface)定义了我希望在从该接口(interface)派生的所有类中重写的函数。在此示例中,假设只有一个纯虚拟函数称为toImplement。我创建了一个名为 Base 的类,该类继承自 BaseInterface ,并为继承的纯虚函数添加了一些功能。 Base仍然是抽象类,因为它没有实现 BaseInterface 中的功能。

我有几个从 Base 派生的类,它们都受益于 Base 的通用功能,但是指定了在实例上运行toImplement时会发生什么。这些类都应该是具体的,并满足 BaseInterface 设置的所有要求。下面,我定义了这些类之一,称为派生

当未对BaseInterface和Base进行模板化时,所有这些工作正常。该代码无需在基础中定义(1.)或实现(2.)toImplement就可以编译并正常运行。

但是我想实现与不同类型。据我了解,在模板化类中具有纯虚函数是很好的。我在某些类型T上将 BaseInterface Base 模板化。当我未在 Base (1.)中定义toImplement时,由于Base不知道在tryUsingImplemented中使用哪个toImplement,因此无法编译。如果现在将定义添加到 Base 中,代码将进行预编译,但是链接器无法找到Base::toImplement的实现。最后,如果我同时在 Base (1和2)中定义和实现toImplement,则代码将编译。

我不喜欢这样,因为我在Base中有一个toImplement的虚拟实现,并且我从不希望运行该实现。另外,由于基础实现了toImplement,因此不再需要派生来实现它。这使 BaseInterface 在我眼中毫无用处。

sombody可以启发我如何在派生的中强制实现toImplement的实现,而如果可能的话,不必先在中实现该实现?

template <typename T>
class BaseInterface {
   virtual void toImplement(T & t) = 0;
};


template <typename T>
class Base : public BaseInterface<T> {
bool m_useImplemented;

public:
   explicit Base(bool useImplemented) : m_usedImplemented(useImplemented) {}

   void tryUsingImplemented(T & t) {
      if (m_useImplemented)
         toImplement(t);
   }

protected:
   // 1: Defining toImplement pure virtual function in Base
   virtual void toImplement(T & t);
};

// 2. Implementing a version of toImplement in Base which does nothing
template <typename T>
inline void Base<T>::toImplement(T & t) {
   // do nothing
}

class Derived : public Base<int> {
public:
   explicit Derived(bool useImplemented) : Base<int>(useImplemented) {}

protected:
   // 3. implementing toImplement in Derived
   void toImplement(T & t) {
      std::cout << "Doing stuff for Derived" << std::endl;
   }

};

最佳答案

供以后引用,如果提供了编译器错误消息,将很有帮助。

但是,在这种情况下,我知道。您的代码中有两个错误:

  • toImplementBaseInterface中是私有(private)的。
  • 不会在基类中查找tryUsingImplemented中的查找。您正面临lookup in dependent bases问题。要解决此问题,请编写this->toImplement(t)
  • 09-16 02:49