Bir hiyerarşinin tüm sınıflarının g
şablon üye işlevini uyguladığını varsayalım. Hala yinelenen kod kurtulmak ve nasıl f1
ve f2
uygulamalarında yanaYinelenen kod olmadan polimorfik işlev çağrısı
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;
}
tüm sınıflarda aynıdır: Bütün sınıflar bu şablonu diyoruz iki diğer fonksiyonlar f1
ve f2
aynı uygulanmasını paylaşan main
'da polimorfik çağrının beklendiği gibi çalışmasını sağlayın (örn. "In B" çıkışını üretin)? f1
ve f2
A
olarak, B
ve C
ait uygulamalar değildir özdeş
Tekrar bir şekilde bakın: hepsi çağrı 'this-> g' nerede '* this' a'' dinamik türüdür. Neden bu yanlış görünmeli? –
AlwaysLearning
@UlwaysLearning Çünkü g 'sanal değildir (ve olamaz), normal derleme zamanı kuralları bunun için geçerli demektir. Derleme zamanı kurallarının C++ 'da varsayılan değer olduğunu unutmayın. Bunun için yalnızca birkaç açık istisna vardır ('virtual', dynamic_cast',' typeid'). – Angew
Sağ. Ama 'f1' sanal. 'F1' içinde' this' tipi 'a''nin dinamik türüdür. Tek istediğim, uygulamanın tekrarlanmasına gerek kalmadan türetilmiş sınıfta 'f1' aynı özdeş uygulamaya sahip olmaktır ... – AlwaysLearning