Ich habe eine Klasse Struktur wie folgt:Overloading Verfahren in der Basisklasse mit Elementvariable als Standard
class Base {
public:
void setDefault(uint8_t my_default) { m_default = my_default; }
void method(uint8_t * subject) { method(subject, m_default); }
virtual void method(uint8_t * subject, uint8_t parameter) =0;
protected:
uint8_t m_default;
};
class Derived1 : public Base {
public:
void method (uint8_t * subject, uint8_t parameter) { /* do something to subject */ }
};
class Derived2 : public Base {
public:
void method (uint8_t * subject, uint8_t parameter) { /* do something different to subject */ }
};
Ich möchte in der Lage sein method(...)
auf jeder Instanz einer Klasse von Base
, welche abgeleitet zu nennen nennen die in der abgeleiteten Klasse definierte Methode, die die Elementvariable als Standardparameter verwendet.
Von dem, was ich an anderer Stelle auf Stack Overflow here gelesen habe, muss die Überschreibung die gleiche Signatur haben, weshalb es nicht kompilieren wird.
Gibt es mögliche Unklarheiten bei diesem Ansatz?
Zwei Möglichkeiten, die ich denken kann, dies zu umgehen:
- einen Standard
method(void)
für jede abgeleitete Klasse erklären, aber die - einen anderen Namen für die Standard-Methode verwenden, nicht sehr trocken erscheinen (zB
defaultMethod(uint8_t * subject)
) aber ich fühle, dass dies meine Klasse weniger intuitiv macht
Gibt es einen besseren Weg um dies?
Hier ist ein vollständiges Beispiel, die nicht kompiliert werden (Arduino IDE 1.7.9):
class Base {
public:
void setDefault(uint8_t my_default) { m_default = my_default; }
void method(uint8_t * subject) { method(subject, m_default); }
virtual void method(uint8_t * subject, uint8_t parameter) =0;
protected:
uint8_t m_default;
};
class Derived1 : public Base {
public:
void method (uint8_t * subject, uint8_t parameter) { *subject += parameter; }
};
class Derived2 : public Base {
public:
void method (uint8_t * subject, uint8_t parameter) { *subject *= parameter; }
};
Derived1 derived1;
Derived2 derived2;
uint8_t subject = 0;
void setup() {
// put your setup code here, to run once:
derived1.setDefault(3);
derived2.setDefault(5);
}
void loop() {
// put your main code here, to run repeatedly:
derived1.method(&subject, 1); // subject == 1
derived2.method(&subject, 2); // subject == 2
// won't compile with this line:
derived1.method(&subject); // subject == 5
}
Fehler produziert wird:
over-ride-load.ino: In function 'void loop()':
over-ride-load.ino:39:29: error: no matching function for call to 'Derived1::method(uint8_t*)'
over-ride-load.ino:39:29: note: candidate is:
over-ride-load.ino:14:12: note: virtual void Derived1::method(uint8_t*, uint8_t)
over-ride-load.ino:14:12: note: candidate expects 2 arguments, 1 provided
Error compiling.
Wenn Sie Tippfehler und die Verwendung reservierter Schlüsselwörter (Standard in C++> 11) setzen, funktioniert il. Fügen Sie einfach eine virtuelle Überschreibung hinzu, um sie klarer zu machen, und Sie sind gut zu gehen. – Davidbrcz
@Davidbrcz - danke, korrigierter Missbrauch des reservierten Wortes im Beispiel –