Załóżmy, że wszystkie klasy hierarchii implementują funkcję elementu szablonu g
. Wszystkie klasy podziela tą realizację dwóch innych funkcji f1
i f2
które wymagają tego szablonu:Wywołanie funkcji polimorficznej bez duplikatu kodu
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;
}
Od implementacji f1
i f2
są identyczne we wszystkich klasach, w jaki sposób mogę pozbyć duplikatu kodu i nadal czy wywołanie polimorficzne w main
działa zgodnie z oczekiwaniami (tzn. generuje wyjście "In B")?
patrzę na to w inny sposób: wszyscy nazywają 'this-> g', gdzie '* this' jest dynamiczny typ' A'. Dlaczego to niewłaściwy sposób patrzenia? –
AlwaysLearning
@AlwaysLearning Ponieważ 'g' nie jest (i nie może być) wirtualny, co oznacza, że mają do niego zastosowanie normalne zasady dotyczące kompilacji. Zwróć uwagę, że reguły kompilacji są domyślne w C++. Istnieje tylko kilka wybranych wyjątków od tego ('virtual',' dynamic_cast', 'typeid'). – Angew
Dobrze. Ale 'f1' jest wirtualny. Wewnątrz 'f1' typ' this' jest dynamicznym typem 'a'. Wszystko, czego chcę, to mieć tę samą, identyczną implementację 'f1' w klasie pochodnej bez potrzeby powtarzania implementacji ... – AlwaysLearning