抽象类参考

时间:2010-06-07 09:29:43

标签: c++ virtual-functions

我可以上课吗

  

教室{〜房间();虚拟成本()   = 0; }

     

Class Hotel {map rooms; / *   * /};

我的酒店会变得抽象吗? 它可以保存从Room派生的具体Room对象列表吗?

3 个答案:

答案 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已经指出的那样),然后删除酒店析构函数中的房间。