gpt4 book ai didi

c++ - 从模板类覆盖纯虚函数

转载 作者:太空狗 更新时间:2023-10-29 21:21:54 25 4
gpt4 key购买 nike

我搜索了堆栈溢出,但没有找到能准确回答我的问题的内容。我有一个接口(interface)类,它只包含纯虚函数,我想由派生自此类的类实现。

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

我有几个派生自 Base 的类,它们都受益于 Base 的通用功能,但指定了在 toImplement 上运行时发生的情况他们的实例。这些类都应该是具体的,并且满足 BaseInterface 设置的所有要求。下面我定义了其中一个名为 Derived 的类。

当 BaseInterface 和 Base 没有模板化时,所有这些都可以正常工作。无需在 Base 中定义 (1.) 或实现 (2.) toImplement,代码即可正常编译和运行。

但是我希望toImplement 能够处理不同的类型。据我了解,在模板类中使用纯虚函数很好。我在某种类型 T 上制作了 BaseInterfaceBase 模板。当我没有在 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;
}

};

最佳答案

为了将来引用,如果您提供编译器错误消息会很有帮助。

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

  1. toImplementBaseInterface 中是私有(private)的。
  2. tryUsingImplemented 中的查找不会在基类中查找。你面对的是 lookup in dependent bases问题。要修复它,请编写 this->toImplement(t)

关于c++ - 从模板类覆盖纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com