一起使用模板和继承时,不知道如何覆盖成员函数

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&lt;T&gt;::work() 并让它工作。

现在我有一个 Grandson 类,它想要覆盖 work 函数。但是覆盖不像Child&lt;T&gt;::call那样工作,我已经明确指定调用Base&lt;T&gt;::work()。那么实现Child&lt;T&gt;::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-&gt;work();而不是Base&lt;T&gt;::work()呢? 不敢相信我什至没有尝试过这个。我一定假设work() 总是等价于this-&gt;work()。如果您可以发布答案,我会接受。顺便说一句,我不清楚错误的含义。如果您能帮助我,将不胜感激。 你也试过Base::work()吗?我认为这只是因为您不应该模板化调用 【参考方案1】:

Base&lt;T&gt;::work() 替换为this-&gt;work()


当您是从依赖于模板参数的基类继承的模板类时,编译器在看到类似work() 的内容时不会查看您的基类。相反,您必须告诉它它需要这样做。我知道的最简单的方法是在调用前加上this-&gt;

至于为什么在你使用Base&lt;T&gt;::work()时它不起作用,我不完全确定。它是硬编码来调用基类实现的,但我相当确定有一个类似的语法可以工作。

【讨论】:

以上是关于一起使用模板和继承时,不知道如何覆盖成员函数的主要内容,如果未能解决你的问题,请参考以下文章

虚函数中的继承关系

Java-继承与覆盖摘抄

成员函数指针和继承

Python Expert:如何继承内置类并覆盖每个成员函数 w.r.t.基类成员函数?

继承&成员函数&覆盖

《面向对象程序设计》高手进~~~~~~~~~~~~!!