从模板派生类访问非模板基类虚函数
accessing non-template base class virtual function from template derived class
我正在尝试理解模板和继承。我有一个基类,如下所示:
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:实际上,您的问题中没有特定于模板的内容。
相关文章:
- 虚拟基类函数中派生类的大小
- 无法访问基类函数 C++
- 如何使派生类函数在调用时始终调用相同的基类函数?
- C++虚拟函数:基类函数是调用的,而不是派生的
- Qt基类函数定义
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- C++ - 基类函数指针调用的替代方法
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- 重载基类函数是不好的做法吗?
- 在 qml 中公开基类函数
- 调用基类函数时强制使用类名?
- 如何判断哪个派生的类对象称为基类函数
- 获取具有基类函数的派生类
- 有没有办法从基类函数参数中推断出模板参数
- 私有非虚拟基类函数被称为派生类中的函数
- 模板基类函数成员的别名
- 如何用相同的签名从main调用基类函数
- C++ 如何从 main 调用派生的基类函数
- memcpy派生类到基类,为什么还调用基类函数