从派生的模板 class 访问非模板基础 class 虚函数

accessing non-template base class virtual function from template derived class

我正在尝试了解模板和继承。我有一个基础 class 如下:

class Base
{
public:
    virtual ~Base() {}
    virtual void setId(u_int8_t id)
    {
        m_id = id;
    }

private:
    u_int8_t m_id;
};

和派生模板 class 如下:

template <typename T>
class Data : public Base
{
public:
    virtual void setId(u_int8_t id)
    {
        this->setId(id);
    }

    inline void setData(const T& data)
    {
        m_data = data;
    }

    inline T& data()
    {
        return m_data;
    }

private:
    T m_data;
};

此代码编译正常,但在 运行 时崩溃。为什么会这样?

由于 setId 不断调用自身,导致堆栈溢出。要在基数 class 中调用 setId,请使用

virtual void setId(u_int8_t id)
{
    Base::setId(id);
}

这个函数:

virtual void setId(u_int8_t id)
{
    this->setId(id);
}

它递归地调用自己,直到进程用完堆栈 space 并且您遇到崩溃。

要从 base-class 调用函数,您必须使用作用域运算符:

Base::setId(id);

setId() 函数永远递归调用自身。你想要:

virtual void setId(u_int8_t id)
{
     Base::setId(Id);
}

Data 中实际上不需要 setId(u_int8_t id)。该方法继承自Base。 如果您打算在派生 class 中提供不同的实现,并在此不同的实现中使用 Base 的实现,则使用 Base::setId(id)(正如 Joachim Pileborg 指出的那样)

P.S.: 实际上,你的问题中没有特定于模板的内容。