idioma non virtuale dell'interfaccia per più di due livelli di eredità?
-
02-07-2019 - |
Domanda
Il linguaggio dell'interfaccia non virtuale descrive come i metodi virtuali sono punti di personalizzazione non pubblici, mentre i metodi pubblici non sono virtuali per consentire alla classe base di controllare in ogni momento come vengono chiamati i punti di personalizzazione.
Questo è un linguaggio elegante e mi piace usarlo, ma come funziona se la classe derivata è una classe base in sé
Soluzione
Funziona, perché la classe derivata può sovrascrivere una funzione virtuale privata di una classe base, anche se la funzione della classe base ignora la sua funzione della classe base.
Questo è perfettamente legale:
class Parent
{
public:
int foo() {return bar();} // the non-virtual public interface
private
virtual int bar();
};
class Child : public Parent
{
private:
virtual int bar(); // overrides Parent::bar()
};
class Grandchild : public Child
{
private:
virtual int bar(); // overrides Child::bar();
};
Altri suggerimenti
La classe derivata può decidere da sola:
Puoi semplicemente sostituire completamente il metodo implementando la funzione virtuale. Puoi aumentare il metodo chiamando la funzione delle classi "centrali" a un certo punto del metodo della classe derivata.
Se non è quello che vuoi, devi impostarlo esplicitamente nella classe 'media'. Non lo farei però. Se ti trovi a desiderare questo, probabilmente significa che non hai assegnato alla classe base abbastanza punti di personalizzazione.