2

所以我试图更好地理解虚拟方法。我有一个基类Sensor和几个子类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 : : 禁用松弛:它不适用于多个定义

因此,如果我想以与每个子类不同的方式定义方法,我会坚持采用哪种方法?

任何见解将不胜感激!

4

2 回答 2

1

看来您正在尝试通过virtual关键字学习动态调度。在动态调度中,对象的实际类型决定了该类中要调用的适当方法。为了实现这一点,基类应该提供一个virtual方法,每个子类都应该覆盖该虚拟方法以提供它们自己的行为。

所以你的每个子类都应该覆盖虚拟方法。

//.h 文件

class SensorTemp : public Sensor
{
 private:


 public:
    virtual void updateValue();

};

//.cpp 文件

void SensorTemp::updateValue() 
{
// ....
}

如果您的子类不覆盖该virtual方法,那么无论对象的实际类型(无论是基类还是子类),virtual都将调用基类方法。

于 2012-12-08T04:20:39.080 回答
1

您的子类实现应如下所示:

void SensorTemp::updateValue() {
    // ...
}
于 2012-12-08T04:16:16.657 回答