PDA

View Full Version : [C++] Alternativa a "virtual static"?


bobotti
13-01-2011, 14:34
Ciao,
dato che in C++ non si può definire un metodo statico come virtuale (e purtroppo neanche virtuale puro) mi chiedevo se qualcuno ne conosce una valida alternativa.

Nello specifico ho una classe astratta con metodi virtuali puri; vorrei infatti che le sue classi derivate, che invece voglio poter istanziare, definiscano tali metodi obbligatoriamente!! In particolare ho previsto che tutte le classi derivate abbiano un metodo STATIC che restituisca la descrizione della classe derivata!!

Ora, consapevole che il metodo static dichiara che il metodo è della classe, e non dell'istanza, quindi incompatibile con il polimorfismo e virtualità, mi chiedo:

Perché non si può fare un metodo statico virtuale PURO nella classe astratta??

E, più importante, come ottenere una cosa simile? Cioè, come obbligare le classi derivate a dichiarare un metodo statico obbligatorio che restituisca la descrizione di tale classe derivata??

Grazie:mbe:

tomminno
13-01-2011, 14:53
In nessun linguaggio puoi definire un metodo virutale e statico. Se ci pensi non ha senso.
Perchè mai ti serve che sia statico?
Potresti creare un unico costruttore della classe base che accetta una descrizione così da obbligare tutte le derivate ad impostare la descrizione a quel punto accessibile da un metodo uguale per tutte le classi (ma ovviamente non statico).

bobotti
13-01-2011, 15:05
In nessun linguaggio puoi definire un metodo virutale e statico. Se ci pensi non ha senso.
Perchè mai ti serve che sia statico?
Potresti creare un unico costruttore della classe base che accetta una descrizione così da obbligare tutte le derivate ad impostare la descrizione a quel punto accessibile da un metodo uguale per tutte le classi (ma ovviamente non statico).

E' vero, in teoria non avrebbe senso. Però io non sto facendo un programma che utilizza varie classi derivate da una sola classe astratta. Sto cercando di creare un programma che, per particolari esigenze, utilizzi UN solo tipo di classe derivata alla volta, ma che questa possa essere cambiata in fase di compilazione.
Per cui all'inizio del programma ho la necessità di avere delle informazioni su questa particolare classe derivata, di qui il bisogno di un metodo statico comune.

Poi potresti anche chiedermi: ma perché fai una classe astratta se tanto puoi cambiare la classe in fase di compilazione? La risposta è semplice: per definire uno standard!! (O almeno è così che l'ho pensata... Non sono un programmatore di grande esperienza, anzi con C++ è la prima volta)

Un'alternativa utile, che non utilizzi all'inizio del main Classe::metodo() che è statico e a mio avviso più elegante, è creare un metodo semplice virtuale puro che restituisca una stringa, istanziarlo nel main magari vuoto e poi chiamare quel metodo. Ma come anticipato mi sembrava più elegante il metodo statico.

Tutto qui

PS Però (al di là di dettagli implementativi della gestione dei puntatori ai metodi) secondo me sarebbe utili poter creare metodi statici virtuali ma PURI! Se è puro non ci sono molti problemi di polimorfismo, no?

tomminno
13-01-2011, 16:04
PS Però (al di là di dettagli implementativi della gestione dei puntatori ai metodi) secondo me sarebbe utili poter creare metodi statici virtuali ma PURI! Se è puro non ci sono molti problemi di polimorfismo, no?

statico e polimorfico hanno ben poco in comune.

Un metodo virtuale (puro o no non ha importanza) dipende dall'oggetto per decidere quale metodo chiamare. Ovviamente un metodo statico non vive nel contesto di un oggetto pertanto non può essere virtuale.
Ma questo prescinde dal C++, è così anche in Java a C#.