Nel CRTP pattern, ci imbattiamo in problemi se vogliamo mantenere la funzione di implementazione nella classe derivata come protetta. Dobbiamo dichiarare la classe base come un amico della classe derivata o usare something like this (non ho provato il metodo nell'articolo collegato). C'è un altro (semplice) modo che consente di mantenere la funzione di implementazione nella classe derivata come protetta?CRTP con membro derivato protetto
Edit: Ecco un semplice esempio di codice:
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;
}
Il codice di cui sopra dà error: ‘void D::foo()’ is protected
con g ++ 4.5.1 ma compila se protected
è sostituito dal public
.
Non è questo ciò che funzioni virtuali sono per? –
@BoPersson, le funzioni virtuali sono per il polimorfismo di run-time, CRTP è per il polimorfismo in fase di compilazione. C'è spazio nel mondo per entrambi. Vedi http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern –
@Mark - Ci sono sicuramente, ma se il requisito è di chiamare una funzione protetta in una classe derivata, i virtual sembrano una buona idea. :-) –