从子对象上的方法返回的奇怪值

时间:2012-03-16 00:43:00

标签: c++ list inheritance constructor

我的派生类有点问题。基本上我有一个超类Object和一个派生类UnmovableObject。我正在尝试将一个布尔变量添加到派生类中,以便稍后我可以读取它并查看我的对象是否可以移动。我遇到的问题是我将所有对象(超级和派生)存储到list<Object> inventory中。每次我从列表中读取值时,我都会得到isFixed()方法的奇怪值(204)。这是代码:

//super class
#pragma once
#include "stdafx.h"

class Object{
public:
    Object(); //constructor
    Object(const string name, const string description); //constructor
    ~Object(); //destructor
private:
    string nameOfObject; //the name of the room
    string objectDescription; //the description of the room
};

//derived class

#pragma once
#include "stdafx.h"
#include "object.h"

//This class creates unmovable objects - the user can't pick them up.
class UnmovableObject : public Object {
public:
    UnmovableObject(string name, string description);
    UnmovableObject(const Object &object)  : Object(object){};
    bool isFixed();
private:
    bool fixed;
};

//the constructor of this class takes a boolean value (by default true) - the object is fixed in this room
UnmovableObject::UnmovableObject(string name, string description) : Object(name, description){
    this->fixed = true;
}

//returns false as the object is not movable
bool UnmovableObject::isFixed(){
    return this->fixed;
}

//other class
list<Object> inventory;

如何使用inventory.push_back(Object/UnmovableObject);,以便在我尝试访问inventory时,我可以获得所有这些的正确布尔值 - true用于UnmovableObject;对象false

2 个答案:

答案 0 :(得分:4)

第一个问题叫做切片。 Wen您存储到Object列表中,只复制派生类型的Object子对象。该列表仅包含Object。如果你需要多态行为,你需要在容器中使用(智能)指针,这样就不会复制对象(只有指针)。

第二个问题是您无法获得类型中不存在的成员属性的值。也就是说,由于Object没有固定成员,因此无法获得其值。

答案 1 :(得分:1)

如果您想知道是否有任何Object被修复,那么您应该让isFixed()成为Object类的成员。然后在派生类中覆盖它。如果你这样做,你实际上不必存储fixed变量。此外,您应该将矢量更改为指向Object s。

的指针向量
class Object
{
public:
    Object(); //constructor
    Object(const string name, const string description); //constructor
    ~Object(); //destructor
    virtual bool isFixed() {return false;}
private:
    string nameOfObject; //the name of the room
    string objectDescription; //the description of the room
};

class UnmovableObject : public Object {
public:
    UnmovableObject(string name, string description);
    UnmovableObject(const Object &object)  : Object(object){};
    virtual bool isFixed() {return true;}
};

vector<Object*> myVector;