C ++继承和模板

时间:2011-06-22 11:04:23

标签: c++ templates inheritance

我有一个列表模板。

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

所以我有一堂课Job:

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

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

假设有两种不同类型的派生类名为Job1Job2,所以我实际上希望我的列表能够拥有Job1 objectsjob2 Objects

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

但是在ListNode c'tor中我有这个:

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

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

3 个答案:

答案 0 :(得分:1)

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

你需要一个模板化的构造函数,它接受真正的类。然后,您将在参数类型上调用构造函数。

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

修改:由于您使用的是new,我假设List<Job>是拼写错误,您的意思是List<Job*>

答案 1 :(得分:0)

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

你可以有一个指向基类的指针列表。

答案 2 :(得分:0)

其他答案不能很好地解决的问题是,当你有一个模板化的类C并且用两种不同的模板类型实例化该类时,为了所有实际目的,编译器将这些视为两个不同的类,而不是一个类以两种方式实例化。

除非您提供将指针存储到列表中的基类的建议,否则这些类型是不兼容的。这样,如果B和D派生出A,那么你可以在列表中存储B *和D *,但是通过A *访问它们。