如何在不指定模板类型的情况下声明通用抽象类的对象

时间:2019-05-23 07:46:11

标签: c++ templates abstract

我在学习C ++中的泛型时遇到一些麻烦。

我想要实现的是拥有一个抽象的泛型类

template <typename T>
class MediaEditor {
    public: virtual ~MediaEditor() = default;
}

然后扩展2个类

class ImageEditor: public MediaEditor<TypeA> {}

class VideoEditor: public MediaEditor<TypeB> {}

然后在我的main()中,我想像这样声明MediaEditor类型的指针:

MediaEditor* editor;

由于它是一个抽象类,所以我认为不需要指定类型,但是gcc通过告诉我必须指定类型参数证明了我的错。

所以他希望我这样声明:

MediaEditor<SomeType>* editor;

但是我要执行的全部操作是不必指定这些参数,以后再使用例如:

editor = new ImageEditor();

你们知道我该怎么做吗?

1 个答案:

答案 0 :(得分:1)

您想做的事不可能直接实现,因为那两个

class ImageEditor: public MediaEditor<TypeA> {}

class VideoEditor: public MediaEditor<TypeB> {}

是完全不相关的类型。 MediaEditor<TypeA>MediaEditor<TypeB>也是两种完全不同的类型。作为同一模板的实例化不会对类型强加任何关系(除了作为同一模板的实例化之外)。

如果您想要多态性,则解决方案与没有模板时的解决方案相同:使用通用基类:

class MediaEditorBase {};

template <typename T>
class MediaEditor : MediaEditorBase {}

现在您可以做

MediaEditorBase* x = new MediaEditor<int>();

PS:“ C ++中的泛型”,严格来说,C ++没有“泛型”。它们被称为模板,不应与Java泛型混淆。这是两个截然不同的概念。