[英]C++ inheritance and templates
我有一个列表模板。
我想列出一份工作。 但是,当唯一不同的是函数executeJob()时,我会有不同的工作。
所以我有一个班级的工作:
class Job{...
...
public:
..
virtual SomeType executeJob() = 0;
}
因此,它实际上是一个抽象类,在派生类中,所有私有字段都相同,并且具有自己的executeJob()实现。
可以说有两种不同类型的派生类,分别称为Job1
和Job2
因此我实际上希望我的列表也能够具有Job1 objects
和job2 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.