【问题标题】:C++ Override Template class virtual function in Template classC++ 覆盖模板类中的模板类虚函数
【发布时间】:2021-11-08 23:26:06
【问题描述】:

我试图在下面的方法中覆盖我的程序中的函数,但是在编译时它显示变量 1 在派生的清除函数中未定义。

将派生类更改为非模板时,我已经能够使其工作,但是在启动 Base 模板时我缺少 DATATYPE 和 VALUE 变量。

template <class DATATYPE=short, short VALUE = 100>
class Base {
    public:
    Base();

    virtual void clear()=0;
    
    protected:
    int variable1;
}


template <class DATATYPE=short, short VALUE = 100>
class Derived : public Base<DATATYPE, VALUE> {
    public:
    Derived();

    void clear() {
        int testVar = variable1;
    }
}

【问题讨论】:

  • 请添加完整的编译器错误信息。
  • 什么是testVar
  • 无论如何,对于您的具体错误,请查看this question,了解为什么访问模板实例化的基类成员需要this-&gt; 前缀。

标签: c++ templates overriding virtual


【解决方案1】:

代码的编译版本:

template <typename data_t, short value_v>
class Base 
{
public:
    Base() = default;               // <== was missing impl, set to default
    virtual ~Base() = default;      // classes with virtual methods must have virtual destructor
    virtual void clear() = 0;

protected:
    int variable1;
}; 


template <typename data_t = short, short value_v = 100>
class Derived : 
    public Base<data_t, value_v>
{
    // by adding a using you can more easily change the template params
    // without having to update all your code. Helps keeping code more readable too
    using base_t = Base<data_t, value_v>;

public:
    void clear() override // <== missing override
    {
        //  different ways of accessing member in template base class
        int v1 = Base<data_t, value_v>::variable1;
        int v2 = this->variable1;
        int v3 = base_t::variable1;
    }
}; 


int main()
{
    Derived<short,100> d;
    d.clear();
}

【讨论】:

  • 存在override 时,不需要virtual 关键字。
  • 好的更新了,只是我习惯的风格
猜你喜欢
  • 2014-08-16
  • 2014-02-06
  • 2014-03-08
  • 1970-01-01
  • 2017-06-28
  • 2018-05-18
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多