C++抽象基模板类非空方法

C++ Abstract Base Template Class Non-Void Method

本文关键字:方法 抽象 C++      更新时间:2023-10-16

我有一个抽象的基模板类,其中包含成员函数,其中一些是空的,另一些返回从原始数据类型到模板参数数据类型的数据类型。我仍然是C++新手,我知道我不一定要在基类中实现纯虚函数,除非我希望在派生类中调用它们。这个想法对于没有返回值的成员函数很好。对于返回整数的函数,我返回了 0。但是当我到达一个返回对模板参数 T 的引用的函数时,我不知道该怎么做。我尝试了以下两个返回。

template <typename T>
T& AbstractBaseClass<T>::function(){
return T();
}

template <typename T>
T& AbstractBaseClass<T>::function(){
return T& tmp= T();
}

但似乎两者都不起作用,我不能不定义这些函数,因为我得到了函数的未定义引用错误。我认为此错误是因为函数是模板。实现非空纯虚函数的适当方法是什么?

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
}
下面是

一个纯虚函数和实现它的派生类的示例(为清楚起见,省略了一些成员函数(:

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

请注意,Base 中的get()没有实现,并且 Derivedget的实现使用了 Base 中不可用的新数据成员。

另请注意,与其他纯虚函数不同,纯虚拟析构函数必须具有实现。通常,如果类中有其他纯函数,则不需要纯虚拟析构函数。此处显示是为了说明。