从派生的模板 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.: 实际上,你的问题中没有特定于模板的内容。
我正在尝试了解模板和继承。我有一个基础 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.: 实际上,你的问题中没有特定于模板的内容。