Remplacement du descripteur de fonction virtuelle [C ++] et sizeof (chaîne) en C ++

  En C ++ 11, afin d'aider les programmeurs à écrire des types de structure hérités complexes, un remplacement de descripteur de fonction virtuelle a été introduit. Si une classe dérivée utilise un descripteur de remplacement lorsque la fonction virtuelle est déclarée, la fonction doit surcharger la classe de base La fonction avec le même nom, sinon le code ne sera pas compilé. Jetons un coup d'œil à cet exemple simple montré dans l'extrait 2-25.
  
  Listing 2-25
  
  struct Base {
  
  virtual void Turing () = 0;
  
  virtual void Dijkstra () = 0;
  
  virtual void VNeumann (int g) = 0;
  
  virtual void DKnuth () const;
  
  void Print ();
  
  };
  
  struct DerivedMid : public Base {
  
  // void VNeumann (double g);
  
  // L'interface est isolée, je voulais avoir une autre version de la fonction VNeumann
  
  };
  
  struct DerivedTop: public DerivedMid {
  
  void Turing () override;
  
  void Dikjstra () override; // Impossible de passer la compilation, mal orthographié, pas surchargé
  
  VNeumann (double g) override; // Impossible de passer la compilation, paramètres incohérents, pas surchargé
  
  void DKnuth () override; // Impossible de passer la compilation, incohérence constante, pas surchargé
  
  void Print () override; // Ne peut pas être compilé, surcharge de fonction non virtuelle
  
  };
  
  // Option de compilation: g ++ -c -std = c ++ 11 2-10-3.cpp
  
  Dans la liste de codes 2-25, nous Dans la classe de base Base, certaines fonctions virtuelles (interfaces) et une fonction non virtuelle Print sont définies. Dans sa classe dérivée DerivedMid, l'interface de base de la classe de base n'est pas surchargée, mais il peut être trouvé à travers des commentaires que l'auteur de DerivedMid voulait une fois surcharger une version "void VNeumann (double g)". Cette ligne de commentaire confond évidemment le programmeur qui a écrit DerivedTop, donc l'auteur de DerivedTop a fait trois erreurs différentes lors de la surcharge de toutes les interfaces de la classe Base:
  
  noms de fonctions mal orthographiés et Dijkstra a mal écrit Dikjstra.
  
  Le prototype de fonction ne correspond pas, le type de paramètre de la fonction VNeumann est confondu avec le type double et la constance de DKnuth est annulée dans la classe dérivée.
  
  Fonction non virtuelle réécrite Imprimer.
  
  S'il n'y a pas de modificateur de remplacement, dans la liste de codes 2-25, les 4 emplacements de l'auteur DerivedTop peuvent être compilés dans le passé, mais il y a une sérieuse déviation de sa volonté (vouloir surcharger la fonction virtuelle) mais le compilateur ne signale pas d'erreur, continuez à compiler. C'est difficile à dépanner. Ajoutez le remplacement de mot clé afin que le compilateur puisse aider à vérifier s'il est surchargé correctement. S'il n'y a pas de modificateur de dérogation DerivedTop, l'auteur peut ne pas réaliser qu'ils ont fait autant d'erreurs après la compilation. Parce que le compilateur n'aura aucun avertissement concernant les trois erreurs ci-dessus. Le modificateur de remplacement ici peut garantir que le compilateur effectue des vérifications auxiliaires. Nous pouvons voir que dans le code du Listing 2-25, les 4 erreurs de l'auteur de DerivedTop n'ont pas pu être compilées.
  
  De plus, il convient de noter qu'en C ++, si un écrivain d'une classe dérivée pense qu'une nouvelle interface a été écrite, il surcharge en fait une interface sous-jacente (certains noms simples tels que get, set et print sont faciles Une telle situation), le compilateur ne peut toujours pas aider dans cette situation. Cependant, une telle surcharge involontaire ne pose généralement pas beaucoup de problèmes, car si l'interface de la variable de classe dérivée appelle cette interface, en plus de la surcharge de fonction virtuelle possible, la version de la classe dérivée sera toujours exécutée. Par conséquent, le compilateur n'a pas besoin de vérifier l'état "non rechargé". Il est plus utile pour les programmeurs de vérifier le mot-clé de remplacement "override".
  
  Il convient également de noter que, comme nous l'avons mentionné au chapitre 1, final / override peut également être défini comme un nom de variable normal, et uniquement lorsqu'il apparaît après qu'une fonction est un mot clé qui peut contrôler l'héritage / dérivation. Avec cette conception, de nombreux codes C ++ 98 contenant des variables finales / de remplacement ou des noms de fonction peuvent être compilés par le compilateur C ++. Cependant, pour des raisons de sécurité, il est recommandé aux lecteurs d'éviter ces noms de variable ou de les définir dans les macros autant que possible dans le code C ++ 11 pour éviter les erreurs inutiles.
  
  Suggestion: si la classe dérivée ressemble à une fonction virtuelle surchargée, ajoutez le mot clé override pour que le compilateur puisse aider à vérifier s'il est surchargé correctement. Si ce mot clé n'est pas ajouté, il n'y a pas d'erreur grave, mais la sécurité de la vérification du compilateur est moindre

 

  // test_max.cpp: 定义 控制台 应用 程序 的 入口 点。
  
  #include "stdafx.h"
  
  #include <iostream>
  
  #include <string>
  
  utilisant l'espace de noms std;
  
  int main (void)
  
  {
  
  string strArr1 [] = {"Cjc", "is", "a"};
  
  chaîne * pStrArr1 = nouvelle chaîne [2];
  
  pStrArr1 [0] = "bon";
  
  pStrArr1 [1] = "garçon.";
  
  cout << "la longueur du type de chaîne est" << sizeof (string) << endl;
  
  for (int i = 0; i <sizeof (strArr1) / sizeof (string); i ++)
  
  {
  
  cout << strArr1 [i];
  
  }
  
  pour (int i = 0; i <sizeof (pStrArr1) / sizeof (string); i ++)
  
  {
  
  cout << pStrArr1 [i];
  
  }
  
  système ("pause");
  

  

  

  
  Les résultats ci-dessus peuvent être vus: dans le système d'exploitation VS2010 windows7 32 bits, la longueur de la classe de chaîne est de 32 octets (liée à la réalisation de la chaîne)
  
  Remarque: sizeof ne peut pas trouver la taille de bloc de mémoire allouée dynamiquement, donc le résultat de sizeof (pStrArr1) est 4

Je suppose que tu aimes

Origine www.cnblogs.com/aquariusunny/p/12729876.html
conseillé
Classement