2012-12-08 150 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

真棒,我誤解了覆蓋如何工作,感謝您的詳細澄清! –