繁体   English   中英

C ++继承和模板

[英]C++ inheritance and templates

我有一个列表模板。

我想列出一份工作。 但是,当唯一不同的是函数executeJob()时,我会有不同的工作。

所以我有一个班级的工作:

class Job{...
...
public:
..
virtual SomeType executeJob() = 0;
}

因此,它实际上是一个抽象类,在派生类中,所有私有字段都相同,并且具有自己的executeJob()实现。

可以说有两种不同类型的派生类,分别称为Job1Job2因此我实际上希望我的列表也能够具有Job1 objectsjob2 Objects

我的列表是这样定义的: List<Job>

但是在ListNode中,我有这个:

    listNode(const T& value) : value(new T(value)), prevNode(NULL),
    nextNode(NULL){}

当然,我对以下行有问题: value(new T(value))因为它是抽象类。 我该如何解决,以便仍可以同时保存Job1 and Job2 objects List<Job>并将其定义为List<Job>

很简单,您不能在构造函数中使用T

您需要一个带模板的构造函数,该构造函数采用真实的类。 然后,您将根据参数的类型调用构造函数。

如果没有类型,而只传递“ Job”,则必须使用虚拟clone()方法(而不是调用构造函数)切换到基于原型的设计。

编辑:由于您使用的是new ,所以我假设List<Job>是一个错字,而您的意思是List<Job*>

您不能有包含不同对象的列表。

但是,您可能有一个指向基类的指针列表。

其他答案不能很好地解决的问题是,当您拥有模板化的类C并使用两种不同的模板类型实例化该类时,出于所有实际目的,编译器将其视为两个不同的类,而不是将一个实例化为两个类方法。

这些类型是不兼容的,除非您接受建议在列表中存储指向基类的指针。 这样,如果B和D派生自A,则可以将B *和D *存储在列表中,但可以通过A *访问它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM