C++派生类用另一个派生类重写基类的成员
C++ Derived class overriding member of base class with another derived class?
我有这样的类:
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对象传递给该函数,我该如何使其调用DerivedPackingLot::something()返回false?这可能吗?对不起,如果我没有正确解释,我不知道该怎么问这个问题。感谢
ParkingLotBuilding
包含ParkingLot
值,而不是ParkingLot
指针或引用,因此即使在DerivedParkingLot
中,它们也不能以多态方式使用。(这就是C++的工作方式:只有指针和引用才能具有动态类型。)
这意味着,如果不能更改ParkingLotBuilding
类(或CheckBuilding
函数),那么就会陷入困境。没有任何派生可以让CheckBuilding
函数对DerivedParkingLot
对象进行操作。
这个故事的寓意是,类必须从一开始就为继承而设计。
实际上,您只是想从ParkingLot实例调用DerivedParkingLot函数吗?
您的代码已经通过将something方法指定为虚拟方法来实现了这一点,它将自动搜索他继承的树中最低的方法。
测试它的一个简单方法是在ParkingLot和DerivedParkingLot中实现something方法,在每个方法中放入不同的消息并检查
实现这一点的一种方法是将ParkingLot
作为模板类。
template<typename T>
class ParkingLotBuilding
{
public:
T Floor1, Floor2;
}
然后在创建ParkingLotBuilding
时,可以使用以下类型:
ParkingLotBuilding<ParkingLot>
ParkingLotBuilding<DerivedParkingLot>
此外,如果您不喜欢一直使用模板,只想使用ParkingLotBuilding
和DerivedParkingLotBuilding
,则可以将类重命名为类似Building
的类,并使用typedefs:
typedef Building<ParkingLot> ParkingLotBuilding
typedef Building<DerivedParkingLot> DerivedParkingLotBuilding
这种方法并不完全是ParkingLotBuilding
类型之间的继承(可能不是最好的方法——我以前从未见过这种方法),但它可能会满足您的需要。
在您的示例中,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
}
}
不过,正如上文所指出的,这样做并不完全是最好的。
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 在 C++ 中用派生类型重写成员函数
- 如果基类包含双指针成员,则派生类的构造函数
- 在派生类中绑定非静态模板化成员函数
- 为什么基指针可以访问虚拟函数中的派生成员变量
- 在销毁派生成员之前,在破坏者中调用共同功能
- 带有派生成员的基类的独特指针
- 为什么基类对象的私有成员仍然从派生成员中分配
- 派生成员函数指针的多态性
- 派生成员和重载Ostream运算符
- 通过指向派生类的指针访问派生成员变量
- 在构造过程中是否有一种简洁的方法可以派生成员的类型?
- 如何使用派生类特定的方法:派生类中的派生成员
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 当我使用根据基类定义的成员函数指针时,编译器如何调用派生成员函数?
- 将luabind派生成员调用为协同程序
- C++ POD 结构继承?是否有任何关于派生成员的内存布局的保证