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

时间:2015-01-14 11:05:36

标签: c++ templates inheritance

我试图理解模板和继承。我有一个基类如下:

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;
};

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

4 个答案:

答案 0 :(得分:4)

由于setId一直在调用自己,因此会出现堆栈溢出。要调用基类中的setId,请使用

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

答案 1 :(得分:1)

此功能:

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

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

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

Base::setId(id);

答案 2 :(得分:1)

setId()函数以递归方式永久调用自身。你想要:

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

答案 3 :(得分:1)

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

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