Differenza tra una funzione virtuale e una funzione virtuale pura [duplicato]
-
27-09-2019 - |
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
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.