从模板化类重写纯虚拟函数
Overriding a pure virtual function from templated classes
我已经搜索了堆栈溢出,但没有找到确切的答案。我有一个接口类,它只包含纯虚拟函数,我希望由派生自该类的类来实现这些函数。
我有一个接口,我将调用BaseInterface,它定义了我希望在从该接口派生的所有类中重写的函数。在本例中,假设只有一个名为toImplement的纯虚拟函数。我创建了一个名为Base的类,该类继承自BaseInterface,并为继承的纯虚拟函数添加了一些功能。Base仍然是一个抽象类,因为它没有实现BaseInterface中的函数。
我有几个从Base派生的类,它们都受益于Base的通用功能,但指定在它们的实例上运行toImplement时会发生什么。这些类都应该是具体的,并满足BaseInterface设置的所有要求。下面我定义了其中一个类,称为Derived。
当BaseInterface和Base未被模板化时,所有这些都可以正常工作。代码编译和运行良好,无需在Base中定义(1.)或实现(2.)toImplement。
但是,我希望toImplement能够使用不同的类型。据我所知,在模板化的类中拥有纯虚拟函数是可以的。我在某些类型T上模板BaseInterface和Base。当我没有在Base(1.)中定义to Implement时,我无法编译,因为Base不知道在tryUsingImplemented中使用哪个toImplement。如果我现在将定义添加到Base,代码会预编译,但链接器找不到Base::toImplement的实现。最后,如果我在Base(1。和2.),代码编译。
我不喜欢这样,因为我在Base中有一个toImplement的伪实现,我从不希望运行这个实现。此外,由于Base实现了toImplement,因此不再需要Derived来实现它。这使得BaseInterface在我看来毫无用处。
Sobody能告诉我如何在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;
}
};
为了便于将来参考,如果您提供编译器错误消息,将会很有帮助。
然而,在这种情况下,我知道。您的代码中有两个错误:
toImplement
在BaseInterface
中是私有的tryUsingImplemented
中的查找不会在基类中查找。您正面临在依赖基中查找的问题。要修复它,请编写this->toImplement(t)
如果要从派生类调用toImplement
,则需要在BaseInterface
中将其声明为protected
。我已经从派生类中删除了所有重写方法,并用int
替换了参数类型Derived::toImplement
,它编译得很好。后者是必要的,因为Derived
不是模板,所以需要使用传递给Base
的模板参数。
#include <iostream>
template <typename T>
class BaseInterface {
protected:
virtual void toImplement(T & t) = 0;
};
template <typename T>
class Base : public BaseInterface<T> {
bool m_useImplemented;
public:
explicit Base(bool useImplemented) : m_useImplemented(useImplemented) {}
void tryUsingImplemented(T & t) {
if (m_useImplemented)
toImplement(t);
}
};
class Derived : public Base<int> {
public:
explicit Derived(bool useImplemented) : Base<int>(useImplemented) {}
protected:
// 3. implementing toImplement in Derived
void toImplement(int & t) {
std::cout << "Doing stuff for Derived" << std::endl;
}
};
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数