首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多态构造函数

多态构造函数
EN

Stack Overflow用户
提问于 2012-05-02 20:32:56
回答 4查看 4.8K关注 0票数 1

我的代码编译得很好,但我遇到了某个特定部分无法显示正确输出的问题。

下面是我的基类

代码语言:javascript
运行
复制
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;}

下面是我的派生类:

代码语言:javascript
运行
复制
 class Bed : public Item
 {
 private:

string frame;
string frameColour;
string mattress;

 public:

 Bed();

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

函数定义:

代码语言:javascript
运行
复制
 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;
}

导致问题的主要部分:

代码语言:javascript
运行
复制
 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会显示正确的输出,但是当我从main函数调用getname和getnumber时,无论其中存储了什么,程序都会为这两个函数打印'1‘。我认为派生类可以使用基类方法,但我错过了什么?任何帮助都是最好的

谢谢Hx

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-02 20:49:21

这看起来不正确(我甚至不确定它是如何编译的):

代码语言:javascript
运行
复制
cout<<v[count]->getName<<endl;
cout<<v[count]->getNumber<<endl; 

因为getNamegetNumber都是方法。更改为:

代码语言:javascript
运行
复制
cout<<v[count]->getName()<<endl;
cout<<v[count]->getNumber()<<endl;

此外,count的初始化没有发布:请确保它是零。

票数 1
EN

Stack Overflow用户

发布于 2012-05-02 20:53:13

那么,您的示例与多态性无关。这里的原因是您没有使用任何虚拟函数。以下是您可以使用的代码。

代码语言:javascript
运行
复制
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();
}    
票数 2
EN

Stack Overflow用户

发布于 2012-05-02 20:37:10

count似乎与您的vector大小相同。在推回最后一个元素之后,您不会递增count,所以打印的是一个较旧的元素。

你为什么不试试:

代码语言:javascript
运行
复制
cout<<v[v.size()-1]->getName<<endl;
cout<<v[v.size()-1]->getNumber<<endl;

此外,您应该开始在构造函数中使用初始化列表:

代码语言:javascript
运行
复制
Bed::Bed(int number, string name, string frm, string fclr, string mtres) :
  Item(name,number),
  frame(frm),
  frameColour(fclr),
  mattress(mtres)
{
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10413834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档