所以,我有一个基类和一个子类。像
这样的东西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()?我会收到一个错误,说'class Device'没有名为'toggleSwith'的成员。这是有道理的,因为'devices'数组是Device。那我怎么称呼孩子的一个成员呢?我试过铸造,但它没有。 感谢。
答案 0 :(得分:1)
另一种解决方案是,当你知道device [i]是一个指向Relay的指针时,就把它投出来。
((Relay *)devices[i])->toggleSwitch();
虚函数的缺点是增加了开销(更多的内存使用和更慢的代码),但只有在为类分配了一个非常大(数百万)的实例时才会出现问题。您还需要修改基类(如果它是您可能不想要的第三部分代码)。
答案 1 :(得分:0)
您需要使用(纯)虚拟功能。在基类中,添加以下内容:
virtual void toggleSwitch() = 0;
virtual int getValue() = 0;
现在,上面的结果将导致您的专业化中实现的虚拟函数能够通过基类指针调用。