2012-05-02 62 views
1

我的代碼編譯得很好,但我遇到了不顯示正確輸出的特定部分的問題。多態構造函數

這裏是我的基類

class Item 
{ 
protected: 

//int count; 
string model_name; 
int item_number; 

public: 

Item(); 
Item(string name, int number); 
    string getName(){return model_name;} 
int getNumber(){return item_number;} 

,這裏是我的派生類:

class Bed : public Item 
{ 
private: 

string frame; 
string frameColour; 
string mattress; 

public: 

Bed(); 

Bed(int number, string name, string frm, string fclr, string mtres); 

功能定義:

Bed::Bed(int number, string name, string frm, string fclr, string mtres) 
{ 
model_name=name; 
item_number=number; 
frame=frm; 
frameColour=fclr; 
mattress=mtres; 
cout<<model_name<<item_number<<frame<<frameColour<<mattress<<endl; 
} 

主要部分,是造成該問題:

Item* item= new Bed(number, name, material, colour, mattress); 
cout<<"working, new bed"<<endl; 
v.push_back(item); 
cout<<"working pushback"<<endl; 
cout<<" this is whats been stored:"<<endl; 
cout<<v[count]->getName<<endl; 
cout<<v[count]->getNumber<<endl; 
count++; 

當程序執行時,構造函數中的cout顯示正確的輸出,但是當我從主函數調用getname和getnumber時,無論存儲在哪裏,程序都會打印「1」。 我認爲派生類可以使用基類方法,我錯過了什麼? 任何幫助將是巨大的

感謝 HX

回答

1

這看起來不正確的(而且我不確定這怎麼連編譯):

cout<<v[count]->getName<<endl; 
cout<<v[count]->getNumber<<endl; 

getNamegetNumber的方法。更改爲:

cout<<v[count]->getName()<<endl; 
cout<<v[count]->getNumber()<<endl; 

此外,中count初始化不貼:確保它是零。

+0

問題是什麼? – hmjd

1

count似乎是你的vector的大小。在推回最後一個元素之後,您不會增加count,因此您正在打印較舊的元素。

你爲什麼不嘗試:

cout<<v[v.size()-1]->getName<<endl; 
cout<<v[v.size()-1]->getNumber<<endl; 

此外,你應該開始在你的構造使用初始化列表:

Bed::Bed(int number, string name, string frm, string fclr, string mtres) : 
    Item(name,number), 
    frame(frm), 
    frameColour(fclr), 
    mattress(mtres) 
{ 
} 
0

您還沒有叫基類的從派生類的構造函數。 ..它應該是第一行...更新代碼,我相信它會開始工作..

編輯

如果沒有比你應該也檢查你正在處理計數變量...由別人指出的方式..

+0

實際上,基類的默認構造函數被調用。基礎成員被分配到派生的構造函數體中。 –

+0

你還應該使用@Lucian建議的初始化方法......你的問題解決了嗎? – aProgrammer

2

那麼,你的例子與多態性無關。這裏的原因是您沒有使用任何虛擬功能。以下是您可以使用的代碼。

class Item 
{ 
protected: 

    std::string model_name; 
    int item_number; 

public: 

    Item(); 
    Item(std::string& name, int number) : model_name(name), item_number(number) {}; 
    std::string getName(){return model_name;} 
    int getNumber(){return item_number;} 
}; 

class Bed : public Item 
{ 
private: 

    std::string frame; 
    std::string frameColour; 
    std::string mattress; 

public: 

    Bed(); 

    Bed(int number, std::string& name, std::string& frm, std::string& fclr, std::string& mtres) : Item(name, number), 
                            frame(frm), 
                            frameColour(fclr), 
                            mattress(mtres) {}; 
}; 

int main() 
{ 
    int count = 0; 
    std::vector<Item*> v; 

    Item* item = new Bed(2, std::string("MyBed"), std::string("wood"), std::string("red"), std::string("soft")); 
    std::cout << "working, new bed" << std::endl; 
    v.push_back(item); 

    std::cout << "working pushback" << std::endl; 
    std::cout << " this is whats been stored:" << std::endl; 
    std::cout << v[count]->getName() << std::endl; 
    std::cout << v[count]->getNumber() << std::endl; 

    ++count; 

    getchar(); 
}