Angenommen, alle Klassen einer Hierarchie implementieren eine Vorlagenelementfunktion g
. Alle Klassen teilen sich die gleiche Implementierung von zwei weiteren Funktionen f1
und f2
die diese Vorlage nennen:Polymorpher Funktionsaufruf ohne doppelten Code
struct A {
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In A" << std::endl;}
};
struct B: A {
// Can I get rid of this duplicate code?
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In B" << std::endl;}
};
struct C: A {
// Can I get rid of this duplicate code?
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In C" << std::endl;}
};
int main()
{
B b;
A &a = b;
a.f1();
return 0;
}
Da die Implementierungen von f1
und f2
sind identisch in allen Klassen, wie kann ich den doppelten Code loszuwerden und noch hat der polymorphe Aufruf in main
funktioniert wie erwartet (dh produzieren die Ausgabe "In B")?
ich einen anderen Weg, um es aussehen: alle nennen sie 'this-> g', wo '* this' der dynamische Typ von' a' ist. Warum ist das der falsche Weg? –
AlwaysLearning
@AlwaysLearning Da 'g' nicht virtuell ist (und nicht sein kann), bedeutet dies, dass normale Regeln für die Kompilierung gelten. Beachten Sie, dass Kompilierzeitregeln die Standardeinstellung in C++ sind. Es gibt nur einige wenige explizite Ausnahmen ('virtual',' dynamic_cast', 'typeid'). – Angew
Rechts. Aber 'f1' ist virtuell. Innerhalb von 'f1' ist der Typ von' this' der dynamische Typ von 'a'. Alles, was ich will, ist die gleiche identische Implementierung von 'f1' in der abgeleiteten Klasse, ohne die Implementierung wiederholen zu müssen ... – AlwaysLearning