【发布时间】:2014-03-08 02:47:51
【问题描述】:
我搜索了堆栈溢出,但没有找到可以准确回答我的问题的内容。我有一个只包含纯虚函数的接口类,我希望由派生自该类的类来实现这些纯虚函数。
我有一个接口,我将调用 BaseInterface,它定义了我希望在派生自该接口的所有类中覆盖的函数。在这个例子中,假设只有一个名为 toImplement 的纯虚函数。我创建了一个名为 Base 的类,它继承自 BaseInterface,并为继承的纯虚函数添加了一些功能。 Base 仍然是一个抽象类,因为它没有实现 BaseInterface 中的功能。
我有几个派生自 Base 的类,它们都受益于 Base 的通用功能,但指定了在运行 toImplement 时会发生什么他们的实例。这些类都应该是具体的并且满足 BaseInterface 设置的所有要求。下面我定义了一个名为Derived的类。
当 BaseInterface 和 Base 没有模板化时,所有这些都可以正常工作。代码编译并运行良好,无需在 Base 中定义 (1.) 或实现 (2.) toImplement。
但是我希望 toImplement 使用不同的类型。据我了解,在模板类中拥有纯虚函数是可以的。我在某些类型 T 上模板 BaseInterface 和 Base。当我没有在 Base 中定义 toImplement 时 (1. ),我无法编译,因为 Base 不知道在 tryUsingImplemented 中使用哪个 toImplement。如果我现在将定义添加到 Base,代码会预编译,但链接器找不到 Base::toImplement 的实现。最后,如果我在 Base(1. 和 2.)中定义和实现 toImplement,代码就会编译。
我不喜欢这个,因为我在 Base 中有一个 toImplement 的虚拟实现,我从不希望这个实现运行。此外,由于 Base 实现了 toImplement,因此不再需要 Derived 来实现它。这使得 BaseInterface 在我看来毫无用处。
谁能告诉我如何在 Derived 中强制实施 toImplement,而不必先在 Base 中实施有可能吗?
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;
}
};
【问题讨论】:
-
您可以提供纯虚函数的定义。如果您不希望派生类执行对
Base::toImplement的非虚拟调用,请将其设为私有函数。 -
我试图尽可能简化我的问题,但我确实忘记将 BaseInterface
::toImplement 定义为受保护的。它在原始代码中,所以问题不是访问权限之一
标签: c++ templates inheritance abstract-class pure-virtual