Question

Lors d’une interview, on m’a demandé quelle était l’utilisation du mot clé virtuel avec une déclaration de classe en C ++ et j’ai répondu que le mot clé virtuel ne pouvait pas être utilisé avec une déclaration de classe en C ++. L'intervieweur a dit que c'était possible et m'a demandé de le tester plus tard.

Maintenant que j’ai vérifié moi-même, j’ai appris que c’est possible et que ce n’est pas une erreur du compilateur. En fait, lorsque je fais quelque chose comme ceci avec un compilateur Visual C ++:

virtual class Test
{
   int i;
};

Je reçois un avertissement du compilateur "C4091: 'virtuel': ignoré à gauche de 'Test' lorsqu'aucune variable n'est déclarée ''. Je n'ai pas encore été en mesure de comprendre la signification de cet avertissement et l'utilisation du mot clé virtuel. S'il n'y a pas d'utilisation utile, alors pourquoi est-ce permis en premier lieu et pourquoi n'est-ce pas une erreur du compilateur?

Était-ce utile?

La solution

C'est un bogue dans VC ++. Comeau et gcc rejettent le code.

Autres conseils

virtuel peut être utilisé pour dériver d'une autre classe:

class Foo : public virtual Bar
{
}

Ceci est utilisé pour éviter d'avoir plusieurs versions de la même classe de base lors de l'utilisation de plusieurs héritages. Wikipedia contient un bon article sur le sujet.

Vous ne pouvez tout simplement pas utiliser virtuel pour une classe. Cela ne fonctionne que pour les fonctions membres

Vous regardez le mauvais type d'utilisation - je suis à peu près sûr que l'intervieweur faisait référence à des déclarations de classe de base virtuelle, comme ceci:

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

C’est un langage courant et utilisé pour contourner la "classe de base multiple" " scénario dans les arbres de succession en forme de diamant. Le problème typique avec eux est que vous héritez des classes B et C et qu'ils partagent le même ancêtre A. Si vous montez dans l'arbre de l'héritage, vous rencontrerez l'ambiguïté de savoir quelle instance de «A» vous êtes. censé utiliser. Si B & amp; Les C ont A comme classe de base virtuelle à la place, ils feront référence à la même instance de A, ce qui résout ce problème.

Vous trouverez une description plus exhaustive des diagrammes de classes ici .

Peut-être faisait-il référence aux classes d'héritage virtuel / base virtuelle? Ex.

class A : virtual public B
{ ... }

Cela ferait techniquement partie de la définition de la classe.

Peut-il parler d'utiliser une classe de base virtuelle dans la déclaration de classe?

Comme ceci:

class CashierQueue : virtual public Queue {};

Ceci est utilisé dans l'héritage multiple lorsque vous souhaitez éviter qu'une classe dérivée ait plusieurs copies des données de membre lorsqu'elle hérite d'au moins deux classes partageant la même classe de base.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top