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

サブクラスの実装は次のようになります。

void SensorTemp::updateValue() {
    // ...
}
于 2012-12-08T04:16:16.657 に答える
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 に答える