1

我有这样的课程:

class ParkingLot
{
public:
    int spaces;
    virtual bool something() { return true; }
}
class ParkingLotBuilding
{
public:
    ParkingLot Floor1, Floor2;
}

我有很多需要 ParkingLotBuilding 的功能。假设某人(我)来自 ParkingLot 和 ParkingLotBuilding:

class DerivedParkingLot : public ParkingLot
{
public:
    virtual bool something() { return false; }
}
class DerivedParkingLotBuilding : public ParkingLotBuilding
{
public:
    // how can I make it so that Floor1 and Floor2 are for DerivedParkingLot?
}

我有一些我无法控制的功能,如下所示:

CheckBuilding( ParkingLotBuilding &building )
{
    if(building.Floor1.something() == true)
    // error
}

如果我将 DerivedParkingLotBuilding 对象传递给该函数,我该如何让它调用 DerivedParkingLot::something() 返回 false?那可能吗?抱歉,如果我没有正确解释这一点,我不知道如何询问这个问题。谢谢

4

4 回答 4

0

实际上,您只是从 ParkingLot 实例调用 DerivedParkingLot 函数?

您的代码已经通过将 something 方法指定为虚拟方法来做到这一点,它将自动搜索其继承树中的最低方法。

一个简单的测试方法是在 ParkingLot 和 DerivedParkingLot 中实现 something 方法,在每个中放入不同的消息并检查它

于 2013-08-22T21:44:20.967 回答
0

您可能能够解决此问题的一种方法是制作ParkingLot模板类。

template<typename T>
class ParkingLotBuilding
{
public:
    T Floor1, Floor2;
}

然后在创建 时ParkingLotBuilding,您可以使用以下类型:

ParkingLotBuilding<ParkingLot>
ParkingLotBuilding<DerivedParkingLot>

此外,如果您不喜欢一直使用模板并且只想使用ParkingLotBuildingand DerivedParkingLotBuilding,您可以将类重命名为类似Building并使用 typedefs:

typedef Building<ParkingLot> ParkingLotBuilding
typedef Building<DerivedParkingLot> DerivedParkingLotBuilding

这种方法并不完全是ParkingLotBuilding类型之间的继承(并且可能不是最好的方法 - 我以前从未见过这种方法),但它可能会满足您的需要。

于 2013-08-22T21:47:20.220 回答
0

正如 JohnSmith 指出的那样,您不能覆盖数据成员,只能覆盖成员函数。由于ParkingLotBuilding包含ParkingLot值,而不是ParkingLot指针或引用,因此它们不能多态使用,即使在DerivedParkingLot. (这正是 C++ 的工作原理:只有指针和引用才能具有动态类型。)

这意味着如果你不能改变ParkingLotBuilding类(或CheckBuilding函数),那么你就会陷入困境。没有任何派生可以让CheckBuilding函数对DerivedParkingLot对象进行操作。

这个故事的寓意是,必须从一开始就为继承设计类。

于 2013-08-23T18:21:37.153 回答
0

在您的示例中,Floor1 无法知道它是在 ParkingLotBuilding 还是 DerivedParkingLotBuilding 内部实例化的。

您可以使用 RTTI 来处理此问题,例如:

CheckBuilding (ParkingLotBuilding *building)
{
    if (dynamic_cast<DerivedParkingLogBuilding*>(building))
    {
        // Floor is in a derived parking log building
    }
    else
    {
        // Floor is in a parking lot building
    }
}

如上所述,这样做并不是最好的。

于 2013-08-23T19:23:52.283 回答