所以我试图更好地理解虚拟方法。 我有一个基类传感器和几个子类 SensorTemp * SensorPh * SensorOrp
class Sensor
{
public:
virtual void updateValue();
}
子类然后用自己的方法定义覆盖updateValue(这发生在每个子类中)
.h文件
#include "Sensor.h"
class SensorTemp : public Sensor
{
private:
public:
};
.Cpp文件
#include "Sensor.h"
#include "SensorTemp.h"
void Sensor::updateValue(){
int reading = analogRead(pinId);
float voltage = reading * 5.0;
voltage /= 1024.0;
currentVal = voltage * 100 ;
Serial.print("temp: "); Serial.println(currentVal);
}
我的问题是这适用于第一个子类声明,虽然以下将有编译器错误:updateValue()....首先在此定义ld.exe ::禁用放宽:它不适用于多个定义
因此,如果我想以不同的方式定义每个子类的方法,我会坚持采取何种方法?
任何见解都会受到高度赞赏!
答案 0 :(得分:1)
您的子类实现应如下所示:
void SensorTemp::updateValue() {
// ...
}
答案 1 :(得分:1)
您似乎正在尝试通过virtual
关键字学习动态调度。在动态调度中,实际类型的对象确定要调用的类的适当方法。为实现此目的,基类应提供virtual
方法,并且每个子类应覆盖该虚方法以提供其自己的行为。
因此,每个子类都应覆盖虚拟方法。
//。h file
class SensorTemp : public Sensor
{
private:
public:
virtual void updateValue();
};
//。cpp文件
void SensorTemp::updateValue()
{
// ....
}
如果你的子类没有覆盖virtual
方法,那么无论对象的实际类型(无论是基类还是子类),基类{{1} }方法将被调用。