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

流先生

我在学习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();

你们知道我该怎么做吗?

maximum_prime_is_463035818

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

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泛型混淆。那是两个截然不同的概念。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不指定模板的情况下声明函数模板指针typedef?

在不指定派生类的情况下声明对象

如何在没有默认构造函数的情况下实现抽象类的Decorator类?

如何在不指定类的情况下使用显式类型参数调用Java方法?

如何在不复制代码的情况下扩展抽象类的Java功能?

如何在不强制转换的情况下为抽象类动态创建对象?

在不指定类型的情况下实例化TypeScript通用类

如何在不声明泛型类型的情况下将类与泛型一起使用

该代码是否在不创建新类的情况下实例化或扩展了抽象类?

如何在不声明 ServletContextEvent 类的对象的情况下使用事件变量来调用方法 getServletContext?

如何在不转换回基类类型的情况下以其派生类型返回对象?

Jackson Databind-如何在不指定目标类的情况下反序列化对象?

如何在不使用reset和new的情况下使用纯抽象类的共享指针?

如何在不指定大小的情况下声明数组,而在C ++中的类内声明一个初始化器?

如何在不扩展Hybris的情况下重新声明核心模型属性类型

如何在不声明 SQL Server 类型的情况下使用参数插入多个值?

是否可以通过模板指定抽象类变量类型?

如何在不创建新对象的情况下返回对象类?

我如何在抽象类中声明任何类型的数组(从给定类型派生)?

如何在不指定Java Enum类型的情况下引用我的Java Enum

如何在不指定类型的情况下修改函数输入参数?

如何在不指定构造函数的情况下从列表中提取可区分的联合类型?

如何在不指定组件类型的情况下将父组件注入共享指令?

如何在不指定共享类型的情况下使用Box Java SDK创建共享链接?

如何在不指定列名的情况下使用jdbcTemplate更新整个对象?

如何在不指定类型的情况下在泛型类上调用静态方法?

如何在不缓存模板的情况下运行Flask?

如何在不需要其中一种类型的情况下指定通用类型?

如何在不注释类型的情况下添加数据类字段?