virtual dans une classe fille

virtual dans une classe fille - C++ - Programmation

Marsh Posté le 24-12-2008 à 10:03:31    

bonjour,
 
soit le code suivant:

Code :
  1. class A
  2. {
  3. public:
  4.     virtual std::string get_type() = 0;
  5. };
  6. class B : public A
  7. {
  8. public:
  9.     virtual std::string get_type() { return "B"; }
  10. };


 
Quel est l'intérêt de déclarer la fonction de la classe B virtual ?
merci
 

Reply

Marsh Posté le 24-12-2008 à 10:03:31   

Reply

Marsh Posté le 24-12-2008 à 12:29:23    

Sémantiquement, ça ne change pas le fait que get_type est virtuelle qu'il y ait virtual ou pas, puisque ça dépend de la définition de A::get_type. Mais la répétition permet de le clarifier, de montrer la redéfinition, etc.

Reply

Marsh Posté le 26-12-2008 à 00:14:29    

je vois thx

Reply

Marsh Posté le 30-12-2008 à 17:37:05    

en terme de taille de l'éxécutable le fait d'ajouter virtual dans B a un impact?


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 31-12-2008 à 09:48:03    

non.

Reply

Marsh Posté le 31-12-2008 à 12:59:35    

j'avais cru comprendre, à tort donc, ou mal, que le compilo rajouter dans l'objet un pointeur "VPTR" sur la vtable (avec initialistion dans le constructeur) dès lors qu'il y avait une fonction déclarée virtual dans la classe, ça ne s'applique que lorsque la classe n'est effectivement dérivée donc ?


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 31-12-2008 à 17:07:32    

non mais bon, un elemtent de vtable c'est 4 octets. Va falloir en empiler pas mal avant d'avoir un overhead notable surtout en tenant compte des optimisations au link.

Reply

Marsh Posté le 31-12-2008 à 17:55:20    

ok


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 18-01-2009 à 22:08:11    

Finalement en essayant ce bout de code, on s'apperçoit que ça ne change rien de rajouter ou non virtual dans une classe fille en terme de taille de l'éxécutable, puisque sauf erreur de ma part à partir du moment ou la fonction est virtual dans la base, la fonction fille hérité de se caractère virtual :

Code :
  1. class Virtual {
  2. public:
  3. virtual void foo() {
  4. }
  5. };
  6. class Base : private Virtual {
  7. public:
  8.  void foo() {
  9.   std::cout << "Base::foo()" << '\n';
  10.  }
  11. };
  12. class Derived : public Base {
  13. public:
  14. void foo() {
  15.  std::cout << "Derived::foo()" << '\n';
  16. }
  17. };
  18. int main()
  19. {
  20. Base* p2 = new Derived;
  21. p2->foo();  //Derived::foo()
  22. }


Message édité par frenchtoucco le 18-01-2009 à 22:09:12

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 18-01-2009 à 22:59:00    

voila
 
"virtual un jour, virtual toujours"

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed