162 votes

Membres virtuels statiques C++ ?

Est-il possible en C++ pour avoir une fonction membre qui est à la fois statique et virtuel? Apparemment, il n'y a pas de moyen simple de le faire (static virtual member(); est un complie d'erreur), mais est-il au moins un moyen d'obtenir le même effet?

I. E:

struct Object
{
     struct TypeInformation;

     static virtual const TypeInformation &GetTypeInformation() const;
};

struct SomeObject : public Object
{
     static virtual const TypeInformation &GetTypeInformation() const;
};

Il est logique d'utiliser GetTypeInformation() à la fois sur une instance (object->GetTypeInformation()) et sur une classe (SomeObject::GetTypeInformation()), ce qui peut être utile pour comparsions et vital pour les modèles.

La seule façon que je peux penser implique l'écriture de deux fonctions, une fonction et une constante, par classe, ou de l'utilisation de macros.

D'autres solutions?

84voto

Adam Rosenfield Points 176408

Non, il n’y a aucun moyen de le faire, car ce qui se passerait lorsque vous avez appelé `` ? Il ne peut pas savoir qui dérivé version de la classe à appeler puisqu’il n’y a pas d’objet qui lui sont associés.

Vous devrez faire une fonction virtuelle non statique pour fonctionner correctement ; Si vous souhaitez également être en mesure d’appeler version un spécifiques dérivées de la classe non-pratiquement sans une instance d’objet, vous devrez fournir une deuxième redunduant statique non virtuelle version ainsi.

59voto

Rasmus Kaj Points 2102

Beaucoup disent il n’est pas possible, j’irais un peu plus loin et dire, ce n’est pas significative.

Un membre statique est quelque chose qui ne se rapporte pas à tous les cas, uniquement à la classe.

Un membre virtuel est quelque chose qui ne se rapporte pas directement à n’importe quelle classe, seulement à une instance.

Si un membre virtuel statique serait quelque chose qui ne se rapporte pas à n’importe quelle instance ou n’importe quelle classe.

24voto

Nate C-K Points 3749

J'ai rencontré ce problème l'autre jour: j'ai eu quelques cours complet de méthodes statiques, mais je voulais utiliser l'héritage et les méthodes virtuelles et de réduire la répétition de code. Ma solution a été:

Au lieu d'utiliser des méthodes statiques, l'utilisation d'un singleton avec des méthodes virtuelles.

En d'autres termes, chaque classe doit contenir une méthode statique que vous appelez pour obtenir un pointeur vers un unique, partagé instance de la classe. Vous pouvez faire les vrais constructeurs privés ou protégés de façon à ce que l'extérieur de code ne peut pas en abuser par la création d'instances supplémentaires.

Dans la pratique, à l'aide d'un singleton est un peu comme à l'aide de méthodes statiques, sauf que vous pouvez prendre avantage de l'héritage et de méthodes virtuelles.

11voto

Alexey Malistov Points 13526

Il est possible. Faire deux fonctions : statique et virtuel

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X