从模板派生类访问非模板基类虚函数

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

本文关键字:基类 函数 派生 访问      更新时间:2023-10-16

我正在尝试理解模板和继承。我有一个基类,如下所示:

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

以及派生的模板类,如下所示:

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。若要调用基类中的setId,请使用

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

此函数:

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

它以递归方式调用自己,直到进程耗尽堆栈空间并且您崩溃。

要从基类调用函数,您必须使用 scope 运算符:

Base::setId(id);

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

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

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

PS:实际上,您的问题中没有特定于模板的内容。