我有一个抽象的基础模板类,它包含成员函数,一些是无效的,另一些则返回从基本数据类型到模板参数数据类型的数据类型。我还是C ++的新手,我知道我不一定要在基类中实现纯虚函数,除非我希望在派生类中调用它们。对于没有返回值的成员函数,这个想法很好。对于返回整数的函数,我返回了0.但是当我得到一个函数返回对模板参数T的引用时,我不知道该怎么做。我尝试了以下两个回归。
template <typename T>
T& AbstractBaseClass<T>::function(){
return T();
}
和
template <typename T>
T& AbstractBaseClass<T>::function(){
return T& tmp= T();
}
但似乎都不起作用,我不能定义这些函数,因为我得到函数的未定义引用错误。我认为这个错误是因为函数是模板。实现非void纯虚函数的适当方法是什么?
template <typename T>
class AbstractBaseClass{
public:
virtual ~AbstractBaseClass() = 0;
T& function();
}
template <typename T>
T& AbstractBaseClass<T>::function(){
//what must I do here when I don't have any member variable
}
答案 0 :(得分:3)
以下是纯虚函数和实现它的派生类的示例(为清晰起见,省略了一些成员函数):
template <class T>
class Base
{
public:
virtual T& get() = 0;
virtual ~Base() = 0;
};
template <class T>
Base<T>::~Base() {}
template <class T>
class Derived: public Base<T>
{
T t;
public:
T& get() override { return t; }
};
请注意get()
中的Base
没有实施,get
中Derived
的实施使用了Base
中没有的新数据成员。< / p>
另请注意,纯虚拟析构函数与其他纯虚函数不同,必须具有实现。通常,如果类中还有其他纯函数,则不需要纯虚拟析构函数。这里显示的是插图。