一起使用模板和继承时,不知道如何覆盖成员函数
Posted
技术标签:
【中文标题】一起使用模板和继承时,不知道如何覆盖成员函数【英文标题】:When using template and inheritance together, I do not know how to override a member function 【发布时间】:2021-02-10 02:59:40 【问题描述】:我有以下混合模板和继承的代码。
Base
类具有一些用于构建项目的实用函数(示例代码中的 work
),Child
在其 API 的实现中调用 work
call
。
在这个函数中
virtual void call() override
Base<T>::work(); // Problem Here
// work();
我尝试拨打work()
,但收到以下错误:
test.cc: In member function ‘virtual void Child<T>::call()’:
test.cc:18:2: error: there are no arguments to ‘work’ that depend on a template parameter, so a declaration of ‘work’ must be available [-fpermissive]
所以我写了Base<T>::work()
并让它工作。
现在我有一个 Grandson
类,它想要覆盖 work
函数。但是覆盖不像Child<T>::call
那样工作,我已经明确指定调用Base<T>::work()
。那么实现Child<T>::call
以使Grandson
中的覆盖起作用的正确方法是什么?
#include <iostream>
template <typename T>
class Base
protected:
virtual void work()
T a;
std::cout << "From Base" << '\n';
public:
virtual void call() = 0;
;
template <typename T>
class Child : public Base<T>
public:
virtual void call() override
Base<T>::work(); // Problem Here
// work();
;
template <typename T>
class Grandson : public Child<T>
protected:
void work() override
std::cout << "From Grandson" << '\n';
;
int main()
Grandson<int> g;
g.call();
【问题讨论】:
如果你写this->work();
而不是Base<T>::work()
呢?
不敢相信我什至没有尝试过这个。我一定假设work()
总是等价于this->work()
。如果您可以发布答案,我会接受。顺便说一句,我不清楚错误的含义。如果您能帮助我,将不胜感激。
你也试过Base::work()吗?我认为这只是因为您不应该模板化调用
【参考方案1】:
将Base<T>::work()
替换为this->work()
。
当您是从依赖于模板参数的基类继承的模板类时,编译器在看到类似work()
的内容时不会查看您的基类。相反,您必须告诉它它需要这样做。我知道的最简单的方法是在调用前加上this->
。
至于为什么在你使用Base<T>::work()
时它不起作用,我不完全确定。它是硬编码来调用基类实现的,但我相当确定有一个类似的语法可以工作。
【讨论】:
以上是关于一起使用模板和继承时,不知道如何覆盖成员函数的主要内容,如果未能解决你的问题,请参考以下文章