2012-12-08 91 views
2

所以我想更好地理解虚拟方法。 我有一个基类传感器和几个子类SensorTemp * SensorPh * SensorOrp虚拟方法和C++中的子类

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:禁用放松:它不会有多重定义

所以我卡上,如果我想从每个子类不同的定义方法,我应该采取什么样的方式工作?

任何有识之士将不胜感激!

回答

1

你子类实现应该是这样的:

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

没关系啊,我误解了它是如何工作,感谢澄清。 –

1

似乎您试图通过virtual关键字来学习动态调度。在动态调度中,对象的实际类型决定了要调用该类的适当方法。为了达到这个目的,基类应该提供一个virtual方法,并且每个子类应该覆盖该虚拟方法来提供它们自己的行为。

因此,每个子类应该覆盖的虚方法。

//.h文件

class SensorTemp : public Sensor 
{ 
private: 


public: 
    virtual void updateValue(); 

}; 

//.cpp文件

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

如果你的子类不重写virtual方法则不论实际类型对象的基本类virtual将调用该对象的(无论是基类还是子类)。

+0

真棒,我误解了覆盖如何工作,感谢您的详细澄清! –