[英]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.