簡體   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