2011-02-27 41 views
0

我試圖創造一些這樣的:作爲參數的子類?

class food 
{ 
public: 
    void EAT(); //Whatever happens... 
    int bitesLeft //This is decreased by one each time you eat the food 
}; 

class cheese: public food 
{ 
public: 
    void EAT(); //Some overloaded form of the "eat" command... 
}; 

有沒有一種方法來創建每個在運行時的一個,並有可能採取一方爲參數沒有搞砸了每個人的bitesLeft變量的函數?

+2

父類中的'EAT'方法不會被重載,即引用具有相同名稱但參數不同的函數。您正在考慮_overriding_,當派生類實現與父類中的名稱和參數相同的函數時會發生這種情況。但是在這種情況下,它也不會被覆蓋,因爲父類中的一個沒有標記爲「虛擬」。發生了什麼是派生類中的定義是_hiding_父類中的定義。 – 2011-02-27 17:19:24

回答

0

是的,有:

void myfunc(food* f) 
{ 
    f->EAT(); 
} 

int main() 
{ 
    food f; 
    cheese c; 
    myfunc(&f); 
    myfunc(&c); 
    return 0; 
} 

然而,對於這個工作,你需要聲明EAT(),如食品類的虛,在virtual void EAT(); 。此外,您可能想將bitesLeft聲明爲受保護的,以便只有類本身以及子類可以訪問它。

+0

謝謝!照顧我的問題! – IamCPlusPlus 2011-02-27 21:15:04

0

兩個對象的成員變量是分開的。此代碼的工作,你希望:

void AFunction(food& x) { 
    x.EAT(); 
} 

food a; 
a.bitesLeft = 10; 
cheese b; 
b.bitesLeft = 5; 

AFunction(a); // a.bitesLeft --> 9 
AFunction(b); // b.bitesLeft --> 4 
+0

這將複製食物對象,然後調用副本上的'EAT()',它不會修改原始對象,因爲您的評論似乎表明,對吧? – JaredC 2011-02-27 17:32:07

+0

@JaredC,你說得對。我在參數中添加了&運算符。現在應該是正確的。 – linepogl 2011-02-27 17:38:26

2

我假設你想要的東西,如:

function doStuff(food * f) { 
    f->EAT(); 
} 

並且希望此調用專門EAT如果如果food在傳遞一個奶酪傳遞,或者非專業的形式在。這種情況下,你需要一個虛擬功能:

class food { 
    public: 
    virtual void EAT(); 
    virtual ~food(); // Any class being used polymorphically should have 
        // a virtual destructor 
} 

class cheese : public food { 
    public: 
    virtual void EAT(); 
} 

我不太清楚你「的意思,而不搞砸了的bytesLeft變量。這是一個公共數據成員,因此任何代碼都可以按照您不希望的方式修改變量的值。這包括cheese類中的代碼,但也包含不在任一類中的代碼。

如果您想阻止cheese.EAT方法中的代碼修改bitesLeft成員,那麼您應該在基類中聲明它爲private

+0

也添加虛擬析構函數的食物。 – UmmaGumma 2011-02-27 17:30:22

+0

好點。我並不打算將它作爲一個完整的工作示例,但我將添加虛擬析構函數,因爲沒有人會成爲一個bug。 – 2011-02-27 17:33:36

+0

+1添加虛擬析構函數:)。 – UmmaGumma 2011-02-27 17:37:59