0

arduinoプロジェクトのために他のいくつかのクラスがベースにできる抽象クラスを作成しようとしています。しかし、ベースで仮想のメソッドを呼び出すときはいつでも、ベース実装を呼び出すだけです。以下のコード。誰かが私が間違っていることを見ることができますか?

#define RTCBASE 0
class RTC_Base {
public:
  virtual uint8_t begin(void){ return 0; };
  virtual void adjust(const DateTime& dt){};
  virtual DateTime now(){ return DateTime(); };
  virtual int Type(){ return RTCBASE; };
};
////////////////////////////////////////////////////////////////////////////////
// RTC based on the DS1307 chip connected via I2C and the Wire library
#define DS1307 1
class RTC_DS1307 : public RTC_Base 
{
public:
  virtual int Type(){ 
    return DS1307; 
  }
  uint8_t begin(void);
  void adjust(const DateTime& dt);
  uint8_t isrunning(void);
  DateTime now();
  uint8_t readMemory(uint8_t offset, uint8_t* data, uint8_t length);
  uint8_t writeMemory(uint8_t offset, uint8_t* data, uint8_t length);


};

///In Code
RTC_Base RTC = RTC_DS1307();
DateTime dt = RTC.now();
//The above call just returns a blank DateTime();
4

1 に答える 1

2

あなたはコードを持っています:

RTC_Base RTC = RTC_DS1307();
DateTime dt = RTC.now(); //The above call just returns a blank DateTime();

これはオブジェクトのスライスです(@chrisが最初に推測したように)。ポリモーフィズムが機能するためには、ポインタまたは参照が実際に派生のアドレスである場合に、ポインタまたは参照をベースとして扱うことにより、派生クラスが基本クラスであると偽る必要があります。(Derivedには実際にはその中にBaseが含まれているため)。

Derived myDerived;
Base &myBaseRef = myDerived;

myBaseRef.myVirtualFunction();

それ以外の場合は、Derivedを作成し、バイトをBaseに強制しようとして、Derivedのすべてのバイトを失います。良くない!=)

重要なのは、DerivedをBaseに変換するのではなく、Derivedにベースであるかのようにアクセスするだけでよいということです。ベースに変換するとベースになります。そして、Baseクラスは空のDateTimeを返します。

動的に割り当てられたメモリを使用してこれを行うには、次のようにします。

Base *myBase = nullptr; //Or 'NULL' if you aren't using C++11
myBase = new Derived;

myBase->myVirtualFunction(); //Dereference the myBase pointer and call the function.

delete myBase; //Free the memory when you are finished.

C ++ 11を使用している場合は、std :: unique_ptrにオブジェクトの存続期間を処理させることができるため、「delete」を呼び出すことを覚えておく必要はありません。

std::unique_ptr<Base> myBase;

//Later...
myBase = new Derived;
myBase->myVirtualFunction();

//Automatically freed when the myBase smart pointer goes out of scope...
于 2013-03-12T04:15:52.640 に答える