Domanda

In un'intervista mi è stato chiesto che cosa è l'uso della parola chiave virtuale con una dichiarazione di classe in C ++ e ho risposto che la parola chiave virtuale non può essere usata con una dichiarazione di classe in C ++. L'intervistatore ha detto che è possibile e mi ha chiesto di testarlo in seguito.

Ora che l'ho verificato da solo, ho capito che questo è possibile e non si tratta di un errore del compilatore. In effetti, quando faccio qualcosa del genere con un compilatore Visual C ++:

virtual class Test
{
   int i;
};

Ricevo un avviso del compilatore "avviso C4091:" virtuale ": ignorato a sinistra di" Test "quando nessuna variabile viene dichiarata". Non sono stato ancora in grado di scoprire che cosa significhi questo avviso e inoltre qual è l'utilizzo della parola chiave virtuale. Se non viene utilizzato in modo utile, perché è consentito in primo luogo e perché non si tratta di un errore del compilatore.

È stato utile?

Soluzione

Questo è un bug in VC ++. Comeau e gcc rifiutano entrambi il codice.

Altri suggerimenti

virtuale può essere utilizzato per derivare da un'altra classe:

class Foo : public virtual Bar
{
}

Questo è usato per evitare di avere più versioni della stessa classe base quando si usa l'ereditarietà multipla. Wikipedia ha un buon articolo sull'argomento.

Semplicemente non puoi usare virtuale per una classe. Funziona solo per le funzioni membro

Stai guardando il tipo di utilizzo sbagliato - Sono abbastanza sicuro che l'intervistatore si riferisse alle dichiarazioni della classe di base virtuale, in questo modo:

  class A : virtual public B, public C {
    ...
  };

Questo è un linguaggio comune e usato per aggirare la "classe base multipla" scenario in alberi ereditari a forma di diamante. Il problema tipico con loro è che erediti sia dalla classe B che dalla classe C e condividono l'antenato comune A. Se vai su "l'albero delle eredità" colpirai l'ambiguità su quale istanza di "A" sei dovrebbe usare. Se B & amp; C ha invece A come classe di base virtuale, si riferiranno alla stessa istanza di A, che risolve questo problema.

Puoi trovare una descrizione più esauriente con i diagrammi di classe qui .

Forse si riferiva all'eredità virtuale / alle classi di base virtuale? Per es.

class A : virtual public B
{ ... }

Sarebbe tecnicamente parte della definizione della classe.

Potrebbe aver parlato dell'uso di una classe di base virtuale nella dichiarazione di classe?

In questo modo:

class CashierQueue : virtual public Queue {};

Viene utilizzato in eredità multipla quando si desidera evitare che una classe derivata abbia più copie dei dati dei membri quando eredita da due o più classi che condividono la stessa classe base.

class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};

Vedi http://msdn.microsoft.com /en-us/library/wcz57btd(VS.80).aspx

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