CRTP pattern'da, uygulama işlevini türetilmiş sınıfta korumalı olarak tutmak istiyorsak sorunlarla karşılaşıyoruz. Temel sınıfı türetilen sınıfın bir arkadaşı olarak bildirmeli veya something like this kullanmalıyız (Bağlantılı makalede yöntemi denemedim). Uygulama işlevinin türetilmiş sınıfta korunmasını sağlayan başka bir (basit) yol var mı?CRTP with Protected Türetilmiş Üye
Düzenleme:
template<class D>
class C {
public:
void base_foo()
{
static_cast<D*>(this)->foo();
}
};
class D: public C<D> {
protected: //ERROR!
void foo() {
}
};
int main() {
D d;
d.base_foo();
return 0;
}
Yukarıdaki kod 4.5.1 ++ g error: ‘void D::foo()’ is protected
verir ama protected
public
ile değiştirilirse derler: Burada, basit bir kod örneğidir.
mi değil bu sanal fonksiyonlar için var? –
@BoPersson, sanal işlevler çalışma zamanı polimorfizmi içindir, CRTP derleme zamanı polimorfizmi içindir. Her ikisinde de dünyaya yer var. Bkz. Http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern –
@Mark - Elbette, ancak türetilmiş bir sınıfta korunan bir işlevi çağırmak gerekirse, sanallar iyi bir uyum gibi görünür. :-) –