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é

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top