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