我可以上课吗
我的酒店会变得抽象吗? 它可以保存从Room派生的具体Room对象列表吗?教室{〜房间();虚拟成本() = 0; }
Class Hotel {map rooms; / * * /};
答案 0 :(得分:5)
您编写的代码不是有效的C ++。如果你的意思是:
class Room{
~Room();
virtual int cost() =0;
};
然后是的,这个类是抽象的。然后你不能创建这样的地图:
map <int, Room> rooms;
但你可以这样:
map <int, Room *> rooms;
然后假设您有一个派生自Room的类SingleRoom并实现cost(),您可以说:
rooms.insert( make_pair( 101, new SingleRoom ) );
另外,请注意抽象类必须具有虚拟析构函数。
答案 1 :(得分:0)
class Hotel
{
public:
void AddRoom()
{
m_Rooms.insert( std::make_pair( 10, new Room )); // Remember to delete
}
void AddNicerRoom()
{
m_Rooms.insert( std::make_pair( 10, new NicerRoom )); // Remember to delete
}
private:
std::map< unsigned int, HotelRoom* > m_Rooms;
}
class HotelRoom
{
public:
~HotelRoom; // Virtual Dtor
protected:
virtual int cost() = 0;
}
class Room : public HotelRoom
{
/*virtual*/ int cost()
{
// impl
}
}
class NicerRoom : public HotelRoom
{
/*virtual*/ int cost()
{
// impl
}
}
你去吧。基本示例,此处HotelRoom是一个抽象类,Room和NicerRoom继承并实现纯虚方法cost
()。这是你可能采取的一种方式。
如果你扩展或改写你的问题,那么我可以更好地理解你的要求我会更新我的答案。
答案 2 :(得分:0)
您可能想要的是酒店可以存储不同类型的房间。 在这种情况下,酒店的地图需要存储指向房间的指针而不是房间本身,如下所示:
class Hotel
{
std::map<int,Room *> roomMap; // maps room numbers to rooms
};
在这个例子中,我使用地图将房间号码映射到指向房间的指针。 如果我们将存储Rooms而不是Room-pointers,那么这不会简单地编译,因为我们无法单独实例化Room。
请注意,如果您存储房间指针,那么之后也应该有人删除房间。给房间一个虚拟的析构函数(就像Neil已经指出的那样),然后删除酒店析构函数中的房间。