2014-12-13 58 views
0
class Base{ 
protected: 
    int remainItems = 0; 
public: 
    Base(){} 
    virtual int numOfItem() = 0; 
}; 
class Deveried1 : public Base{ 
public: 
    Deveried1() :Base(){ remainItems = numOfItem(); } 
    int numOfItem(){ 
     return 5; 
    } 
}; 
class Deveried2 : public Base{ 
public: 
    Deveried2() :Base(){ remainItems = numOfItem(); } 
    int numOfItem(){ 
     return 10; 
    } 
}; 
class Deveried3 : public Base{ 
public: 
    Deveried3() :Base(){ remainItems = numOfItem(); } 
    int numOfItem(){ 
     return 10; 
    } 
}; 
int main(){ 
    Base* foo = new Deveried3; 
} 

有了這樣的設計,對於每一個deveried類,我都必須在構造函數中爲initalize remainingItems做同樣的事情。我想知道在這種情況下是否有更好的方式/模式。如何更改變量initializated取決於虛函數

+0

您不能在基類構造函數中調用虛函數。 – 2014-12-13 11:35:12

+0

這是什麼方法?難道你不能只創建一個以'remainingItems'作爲參數的第二個基類構造器嗎? – nvoigt 2014-12-13 11:35:32

+0

該方法用於爲不同的Deveried類存儲numofItem,因此在開始時,remainingItems = numofItem。 – user2477 2014-12-13 11:38:17

回答

1

我沒有看到任何方法的好處,所以我刪除,並增加了一個選項來傳遞變量在基類的構造函數:

class Base{ 
protected: 
    int remainItems; 
public: 
    Base(remainItems = 0) { this->remainItems = remainItems; } 
}; 

class Deveried1 : public Base{ 
public: 
    Deveried1() :Base(5){} 
    } 
}; 

class Deveried2 : public Base{ 
public: 
    Deveried2() :Base(10){} 
    } 
}; 

class Deveried3 : public Base{ 
public: 
    Deveried3() :Base(10){} 
    } 
}; 

int main(){ 
    Base* foo = new Deveried3; 
} 
+0

因爲多態只適用於方法,而不是變量。所以使用「numOfItem()」來代替const numOfItem – user2477 2014-12-13 11:49:28

+0

@ user2477我不認爲我理解你的評論。你的代碼是否允許任何這些代碼不會? – nvoigt 2014-12-13 11:53:47

+0

您的代碼是正確的(僅適用於我的示例代碼)。我只是解釋了爲什麼我使用numOfItem()而不是幻數(爲了可讀性而受益),numOfItem在許多地方使用,不僅在構造函數中。 – user2477 2014-12-13 11:58:18

2

事實上,你不能調用從派生類函數基類的構造函數,所以這種扭曲的依賴關係無法正常工作。我的價值傳遞給基類的構造函數:

Base(int numOfItems) : remainItems(nomOfItems) {} 
Derived1() : Base(5) {} 
Derived2() : Base(10) {}