私は異なるプロジェクトの多くの他のクラスによって継承される基本クラスを持っています。 1つのプロジェクトでは、基本クラスに追加が必要です。残念ながら、これは他のすべてのプロジェクトをコンパイルしようとするとエラーになります。C++継承クラスに影響を与えずに基本クラスを変更
基本クラス:
class MidiBase
{
public:
virtual void midiNoteOnReceived(unsigned char note, unsigned char velocity) = 0;
virtual void midiNoteOffReceived(unsigned char note) = 0;
virtual void midiClockStartReceived(void) = 0;
virtual void midiClockStopReceived(void) = 0;
virtual void midiSysexStartReceived(void) = 0;
virtual void midiSysexDataReceived(unsigned char index, unsigned char data) = 0;
virtual void midiSysexStopReceived(void) = 0;
virtual void midiSysexWrite(unsigned char data) = 0;
virtual void midiControlChangeReceived(unsigned char cc, unsigned char val) = 0;
virtual void midiPitchBendReceived(char bend) = 0;
virtual void midiProgramChangeReceived(unsigned char patchNum) = 0; //THIS IS THE NEW LINE
};
例は、新しい行を使用する必要はありませんが、それなしでコンパイルされませんクラスを継承した:
#include "Midi.h"
#include "MidiBase.h"
class OdyEngine : public MidiBase
{
//variables
public:
static OdyEngine& getInstance()
{
static OdyEngine instance; // Guaranteed to be destroyed.
return instance;
}
protected:
private:
Midi* midi_;
//functions
public:
const Midi* getMidiPtr() const { return midi_; }
Midi* getMidiPtr() { return midi_; }
void midiControlChangeReceived(unsigned char anlControl_, unsigned char val);
void midiNoteOnReceived(unsigned char note, unsigned char velocity);
void midiNoteOffReceived(unsigned char note);
void midiClockStartReceived(void){}
void midiClockStopReceived(void){}
void midiSysexStartReceived(void){}
void midiSysexDataReceived(unsigned char index, unsigned char data){}
void midiSysexStopReceived(void){}
void midiSysexWrite(unsigned char data){}
void midiChannelChanged(unsigned char channel);
void midiPitchBendReceived(char bend);
//void midiProgramChangeReceived(unsigned char patchNum){} //WILL NOT COMPILE WITHOUT THIS
protected:
private:
OdyEngine(OdyEngineBase* base);
OdyEngine() {}
OdyEngine(const OdyEngine &c);
~OdyEngine();
OdyEngine& operator=(const OdyEngine &c);
}; //OdyEngine
は新しいを追加する方法はあります私は1つの継承クラスでの使用に新しい関数が必要なので、それを使用するすべての継承クラスを変更することなく、基本クラスにコードを追加できます。他の派生クラスがそれを実装する必要がない
virtual void midiProgramChangeReceived(unsigned char) { }
この方法:
新しいメソッドのデフォルト実装を提供する必要があるようです。新しいメソッドが呼び出されたときに、既存のすべての派生クラスはどのようにふるまうべきですか?その質問に答えることができない場合は、クラス階層を再考する必要があります。おそらく 'MidiBase'から継承した中間クラスを導入し、新しいメソッドだけを追加します。 –
@paulsoulsbyこれを配列に配置していますか? –
@FrançoisAndrieuxデフォルトの実装は「何もしない」です。私は今のところ、継承されたすべてのクラスを更新すると思います。そのうちの8つしかありません。そのうちの100個(たとえば100個)がある場合は、アプローチを考えていただけでした。 – paulsoulsby