Domanda

  

Eventuali duplicati:
   C ++ virtuale / Pure virtuale spiegato

Qual è la differenza tra una funzione virtuale pura e una funzione virtuale?

Lo so "Pure funzione virtuale è una funzione virtuale senza corpo", ma cosa significa e che cosa è in realtà fatto dalla linea di seguito:

virtual void virtualfunctioname() = 0
È stato utile?

Soluzione

Una funzione virtuale fa sua classe una classe base polimorfica . Le classi derivate possono sovrascrivere funzioni virtuali. Le funzioni virtuali chiamati tramite puntatori di classe base / riferimenti saranno risolti a run-time. Cioè, il tipo dinamico dell'oggetto è usato invece del tipo statico :

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

Una funzione virtuale pura è una funzione virtuale in cui estremità =0 dichiarazione:

class Base {
  // ...
  virtual void f() = 0;
  // ...

Una funzione virtuale pura rende implicitamente la classe è definita per abstract (a differenza di Java, dove si ha una parola chiave per dichiarare esplicitamente la classe astratta). classi astratte non possono essere istanziati. Le classi derivate devono ignorare / implementare tutte le funzioni virtuali pure ereditate. Se non lo fanno, anche loro diventeranno astratta.

Un 'caratteristica' interessante di C ++ è che una classe può definire una funzione virtuale pura che ha un'implementazione. ( cosa che fa bene è discutibile .)


Si noti che C ++ 11 ha portato un nuovo impiego per le delete e default parole chiave che è simile alla sintassi delle funzioni virtuali puri:

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

questa domanda e questo uno per maggiori informazioni su questo uso di delete e default.

Altri suggerimenti

Per una funzione virtuale è necessario fornire implementazione nella classe base. Tuttavia classe derivata può sostituire questa implementazione con la propria implementazione. Normalmente, per funzioni virtuali pure non è prevista attuazione. È possibile effettuare una funzione di pura virtuale con =0 alla fine della dichiarazione di funzione. Inoltre, una classe che contiene una funzione virtuale pura è astratto cioè non è possibile creare un oggetto di questa classe.

Una funzione virtuale pura non è di solito (ma può essere) implementato in una classe base e deve essere attuata in una sottoclasse foglia.

Si indicano questo fatto aggiungendo il "= 0" per la dichiarazione, in questo modo:

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

Quindi non è possibile dichiarare e creare un'istanza di una sottoclasse senza di essa l'attuazione della funzione virtuale pura:

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

aggiungendo la parola chiave override, il compilatore farà in modo che ci sia una funzione virtuale classe di base con la stessa firma.

Si può effettivamente fornire implementazioni di funzioni virtuali puri in C ++. L'unica differenza è tutte le funzioni virtuali puri devono essere realizzate da classi derivate prima della classe può essere istanziata.

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