Domanda

che cosa significa esattamente da technical point of view, ho capito che vuol dire che il mio derived class può sempre essere convertito in base class, il gioco è fatto? Ho letto alcuni materiali senza alcun riferimento agli aspetti tecnici, solo la filosofia! grazie in anticipo

È stato utile?

Soluzione

vuol dire che la mia classe derivata può sempre essere convertito in classe di base

In realtà vuol dire meglio di così. int può sempre essere convertito float, ma questo non significa che un int "è un" float. Significa solo un galleggiante può essere costruito da un int. Allo stesso modo è possibile avere classi definite dall'utente che converte, ma non hanno altro rapporto.

Con eredità, un puntatore o riferimento alla classe derivata può sempre essere convertito in un puntatore o riferimento alla classe di base [*]. Vale a dire, un oggetto della classe derivata può stare al posto di un oggetto della classe base. In realtà è una di quelle cose. Se una persona può stare in un chirurgo del cervello, quindi sono un chirurgo del cervello.

Una definizione formale se "è un" è di Barbara Liskov principio di sostituzione di . Che devo ammettere che è ancora la filosofia, ma è la filosofia molto suono e si riferisce direttamente a come si scrive i programmi.

L'altra cosa che dovete tenere diritta durante l'uso di successione in C ++ è la differenza tra il polimorfismo runtime (ottenuto utilizzando le funzioni virtual) e il polimorfismo statico (che in realtà non richiede eredità a tutti). Con chiamate di funzione non virtuali, la versione della funzione chiamata è sempre la versione definito nella classe che il compilatore è detto l'oggetto ha (il tipo statico). Questo potrebbe non funzionare correttamente in realtà, se è sovraccaricato nella classe derivata. Con chiamate virtuali, la versione chiamata è la versione definito nella classe dell'oggetto è effettivamente (tipo dinamico). E 'essenziale per decidere quale dei due tipi di "è un" si sta mirando.

[*] e l'oggetto essere validamente accessibili tramite il puntatore, che è. Si può sempre tipi di puntatore costringere con reinterpret_cast, ma non è questo quello che voglio dire qui. E ci sono alcuni dettagli poco pratici - se la classe base è ambiguo, allora non è possibile convertire il puntatore in una sola volta, ma è possibile farlo utilizzando esplicitamente diversi calchi inequivocabili. Se la classe di base non è accessibile allora possono convertirlo, ma solo con un cast C-style, non è implicito. Il cast C-style si comporta come un static_cast che ignora l'accessibilità, non come un reinterpret_class. Così si ottiene un puntatore di lavoro, ma si spera anche un forte senso che si sta facendo qualcosa di molto sbagliato; -)

Altri suggerimenti

Una classe derivata può essere convertito in solo una classe base accessibile e inequivocabile in un determinato punto R. Non v'è alcuna carenza di riferimenti e quale altro luogo rispetto al C ++ standard stesso.

  

$ 10.2 è un riferimento buono: un derivato   classe stessa può servire come classe base   soggetta a controllo di accesso; vedi 11.2. UN   puntatore a una classe derivata può essere   implicitamente convertito in un puntatore a   una classe base inequivocabile accessibili   (4.10). Un lvalue di una classe derivata   tipo può essere associato a un riferimento a un   accessibile classe base univoca   (8.5.3). -end nota]

E ancora

  

$ 10.3 - "La base-specificatore-list   specifica il tipo della classe base   sottooggetti contenuta in un oggetto di   il tipo di classe derivata. [..] Qui, un   oggetto della classe Derived2 avrà un   subobject di classe derivata, che in   sua volta avrà una sotto-oggetto di classe   Base. [...]

In termini di principi OOAD:

Io personalmente consigliamo articoli di Robert Martin per ottenere una buona tenuta su questo in particolare il principio di OCP . Non è possibile per me battere la chiarezza e l'autorità con cui l'autore spiega queste linee guida OOAD leggendari

Anche guardare LSP come spiegato in post @Steves'

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