这是一个Arduino项目,它有一个模式按钮。该按钮将当前应用程序变量更改为播放器/收音机/导航/电话。所有应用程序都继承自“App”。
如果我运行“apps [0] - > volume_up();”,我会大声说我的应用程序中没有方法volume_up。如果我将它添加到App,它会在App中执行volume_up,而不是在Player中执行。
我做错了什么?
int index = 0;
App *apps[4];
void setup(){
Player *player = new Player();
Radio *radio = new Radio();
Navigation *navigation = new Navigation();
Phone *phone = new Phone();
apps[0] = player;
apps[1] = radio;
apps[2] = navigation;
apps[3] = phone;
}
void loop(){
int sensorValue = analogRead(A0);
if (sensorValue == 156 || sensorValue == 157){ // Mode button
index = (index + 1) % (sizeof(apps)/sizeof(apps[0]));
delay(300);
}
if (sensorValue == 24 || sensorValue == 23){ // Volume button
apps[index]->volume_up();
delay(100);
}
}
#ifndef App_H
#define App_H
#include "Arduino.h"
class App {
public:
void volume_up();
};
#endif
#include "App.h"
void App::volume_up(){
Serial.println("VOLUME_UP");
}
答案 0 :(得分:0)
如果要从父级调用方法,请在子类的方法中使用App::volume_up()
。或者将方法标记为virtual
,如
virtual void App::volume_up(){ }
你可以在子类中调用它。
您需要在班级App
等中继承班级Phone
。
class Phone : public App {
};
然后
void Phone::volume_up() { App::volume_up(); }
如果您不使用虚拟方法,或
void Phone::volume_up() { //Phone implementation }
如果您使用虚拟方法。
要使用运行时多态,你需要像你一样创建指针!
查看维基百科文章 Virtual function 和Stack Overflow问题 Call a C++ base class method automatically 。