我试图理解模板和继承。我有一个基类如下:
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;
};
此代码编译良好但在运行时崩溃。为什么会这样?
答案 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。:实际上,你的问题中没有特定的模板。