使用抽象类的子类专门化模板

Specialize template with a subclass of an abstract class

本文关键字:专门化 子类 抽象类      更新时间:2023-10-16

我遇到了以下问题:

我有一个带有模板T的类Test.当我创建此类的对象时,专门用于其他公共类,一切正常。在类 Test 的构造函数中,有一行代码用于创建模板类的对象;

但是当我尝试实例化这个类(Test(,用抽象类(Dummy(的子类(SubDummy(专门化它时,我得到一个错误:无法实例化抽象类。

示例代码(简化为本文的目的(:

class Dummy
{
private:
    virtual void _nothing() = 0;    // this makes the class abstract
};
class SubDummy : public Dummy
{
public:
    SubDummy() :
        Dummy()
    {
    }
};
template <class T>
    class Test
{
public:
    Test()
    {
        T t;    // here the compiler reports the error
    }
};
int main()
{
    Test<SubDummy> x;
}

包含纯虚拟成员函数的类根本无法实例化。由于您没有在SubDummy中指定_nothing的覆盖,因此它在此类中也是纯虚拟的。您必须在SubDummy中实现_nothing才能使其正常工作。

有时,在调试模板时,考虑使用变量实例化类时类变成什么很有用。

    class TestWithSubDummy {
       public:
           TestWithSubDummy() {
                 SubDummy t;//the error
            }
     };

很明显,您正在尝试在错误处实例化SubDummy(使用默认构造函数(。但是SubDummy是抽象的,所以我们不允许实例化它。因此,错误。