c ++中的虚方法和子类

时间:2012-12-08 04:12:10

标签: c++

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

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

任何见解都会受到高度赞赏!

2 个答案:

答案 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} }方法将被调用。