我的派生类有点问题。基本上我有一个超类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
。
答案 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;