Domanda

Qual è la differenza tra le seguenti due dichiarazioni?

virtual void calculateBase() = 0;  
virtual void calculateBase();

Ho letto che il primo (= 0) è una "funzione astratta pura" ma cosa rende questo secondo?

È stato utile?

Soluzione

La prima è chiamata pura funzione virtuale. Le funzioni virtuali normalmente pure non avranno alcuna implementazione e non è possibile creare un'istanza di una classe contenente una funzione virtuale pura.

La seconda è una funzione virtuale (cioè una funzione virtuale 'normale'). Una classe fornisce l'implementazione per questa funzione, ma la sua classe derivata può sovrascrivere questa implementazione fornendo la propria implementazione per questo metodo.

Altri suggerimenti

Il primo è un "puro virtuale" - renderà astratta la classe, tentando di creare un'istanza comporterà errori del compilatore. È pensato per essere usato come una classe base in cui la classe derivata implementa il comportamento necessario implementando la funzione virtuale pura. Non è necessario implementare la funzione nella classe base, sebbene sia possibile.
Questo è un motivo spesso usato per due motivi di progettazione:

  • Il " metodo di modello " , in cui la classe base implementa una struttura attorno una chiamata di funzione, ma i dettagli della chiamata di funzione devono essere compilati dalla classe derivata e
  • L'interfaccia " " modello di progettazione, poiché C ++ non ha la parola chiave dell'interfaccia. Le classi di base astratte, idealmente con solo funzioni virtuali pure e nessun dato membro, sono il modo C ++ per definire le interfacce.

La seconda dichiarazione è solo una normale dichiarazione di funzione membro virtuale. Si otterranno errori del compilatore se non si implementa la funzione membro nella classe base. È ancora virtuale, il che implica che può essere utile sovrascrivere il comportamento in una classe derivata.

Il primo non deve essere implementato nella classe base, ma impone che sia implementato nelle classi ereditate.

Devi implementare il secondo nella classe base e può essere implementato in classi ereditate.

Fondamentalmente, quando erediti, sei costretto a sovrascrivere il primo e ti è permesso di scavalcare il secondo.

Proveniente da Java, vero?

Penso che tu stia mescolando i termini ...

virtual void x() = 0;

è una pura funzione virtuale , o funzione astratta. È una funzione virtuale senza implementazione. Parli di una classe astratta pura, che è l'equivalente c ++ di un'interfaccia, di una classe che ha solo funzioni astratte.

virtual void x();

è una funzione virtuale, il che significa che può essere ridefinita in classi derivate, ma non è astratta, quindi è necessario fornire un'implementazione per essa.

  

virtual void compareBase () = 0;

La prima funzione è Pure virtual function in cui l'implementazione non può essere eseguita nella classe e funge da pura classe astratta o classe Interface. L'implementazione concreta dovrebbe essere eseguita o sostituita in una sottoclasse. Funge da classe di interfaccia per le sue classi derivate.

  

virtual void compareBase ();

Questa funzione è una funzione virtuale in cui l'implementazione (impostazione predefinita) può essere eseguita nella classe base. Ma la classe derivata deve essere sostituita dalla propria propria implementazione.

In Java

virtual void calculateBase() = 0;  

sarebbe

abstract void calculateBase();

e

virtual void calculateBase();

sarebbe

void calculateBase();

Per essere perfettamente chiari,

final void calculateBase();

in C ++ è " lo stesso " come

<*>

in Java. Cioè, final è "predefinito" in C ++. Esiste tuttavia un'eccezione a questa regola. Quando si esegue la sottoclasse di una classe con un metodo virtuale e la si reimplementa senza utilizzare la parola chiave virtuale, il metodo nella sottoclasse non sarà definitivo.

La seconda funzione deve avere un'implementazione nella classe che la dichiari (mancanza di '= 0') e può essere sostituito da subClass.

La prima funzione può avere o meno un'implementazione nella classe che la dichiara e deve essere implementata da sottoclassi

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