我搜索了堆栈溢出,但没有找到能完全回答我问题的东西。我有一个仅包含纯虚函数的接口(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;
}
};
最佳答案
供以后引用,如果提供了编译器错误消息,将很有帮助。
但是,在这种情况下,我知道。您的代码中有两个错误:
toImplement
在BaseInterface
中是私有(private)的。 tryUsingImplemented
中的查找。您正面临lookup in dependent bases问题。要解决此问题,请编写this->toImplement(t)
。