Si supponga che tutte le classi di una gerarchia implementino una funzione membro modello g
. Tutte le classi condividono la stessa realizzazione di altre due funzioni f1
e f2
che chiamano questo modello:Chiamata di funzione polimorfica senza codice duplicato
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;
}
Dal momento che le implementazioni di f1
e f2
sono identiche in tutte le classi, come posso liberarmi del codice duplicato ed ancora la chiamata polimorfica in main
funziona come previsto (ovvero produce l'uscita "In B")?
lo guardo un altro modo: tutti li chiamano 'this-> g', dove '* this' è il tipo dinamico di' a'. Perché questo è il modo sbagliato di guardare? –
AlwaysLearning
@AlwaysLearning Perché 'g' non è (e non può essere) virtuale, il che significa che a esso si applicano normali regole di compilazione. Nota che le regole di compilazione sono predefinite in C++. Esistono solo poche eccezioni esplicite a questo ('virtuale',' dynamic_cast', 'typeid'). – Angew
Giusto. Ma 'f1' è virtuale. All'interno di 'f1' il tipo di' this' è il tipo dinamico di 'a'. Tutto quello che voglio è avere la stessa identica implementazione di 'f1' nella classe derivata senza dover ripetere l'implementazione ... – AlwaysLearning