从基/父数组调用子成员

Calling child member from Base/Parent array?

本文关键字:成员 调用 数组 从基      更新时间:2023-10-16

所以,我有一个基类和一个子类。就像

Class Device 
{
     double read();
}
Class Relay : Public Device
{
      void toggleSwitch();
}
Class Sensor : Public Device
{
      int getValue();
}

我有一个数组来存储对象,这样我就可以跟踪它们

Device *devices[10];
devices[0] = new Relay();
devices[1] = new Sensor();
etc…

devices[0]->toggleSwitch(); // error

可以从这些设备中调用成员read(),因为read()在基类中。那么我如何在Relay中调用toggleSwitch()呢?我会得到一个错误说'类设备'没有名为'toggleSwith'的成员。这是有意义的,因为'devices'数组是Device的。那么我如何调用子元素的成员呢?我试过选演员,但效果不理想。谢谢。

另一个解决方案是,当你知道device[i]是一个指向Relay的指针时,只需强制转换它。

((Relay *)devices[i])->toggleSwitch();

虚拟函数的缺点是增加了开销(更多的内存使用和更慢的代码),但是只有当您为类分配大量(数百万)实例时,这才会出现问题。您还需要修改基类(如果它是第三部分代码,您可能不希望这样做)。

您需要使用(纯)虚函数。在基类中,添加以下内容:

virtual void toggleSwitch() = 0;
virtual int getValue() = 0;

以上将导致那些在专门化中实现的虚函数可以通过基类指针调用。