Question sur l'héritage en C++

Question sur l'héritage en C++ - C++ - Programmation

Marsh Posté le 08-04-2006 à 01:09:24    

Bonjour,

 

aujourdh'ui j'ai rencontré un problème avec des héritages en C++. Voici les deux classes à l'origine du problèmes.

 
Code :
  1. class BaseMessage {
  2. public:
  3.    std:string toXML();
  4.    virtual void toXML(XMLWriter& writer) = 0;
  5. }
  6. class Message : public BaseMessage {
  7. public:
  8.    void toXML(XMLWriter& writer);
  9. }


Lorsque je fait :

Code :
  1. Message aMessage;
  2. aMessage.toXML();

J'ai l'erreur suivante :

 

error: no matching function for call to 'Message::toXML()'
 
./message.h:29: note: candidates are: virtual void Message::toXML(XMLWriter& )


Si je change la méthode toXML() en toXMLString cela marche.

 

D'ou vient le problème ?

 

Merci.

 


Reply

Marsh Posté le 08-04-2006 à 01:09:24   

Reply

Marsh Posté le 08-04-2006 à 03:54:40    

L'argument de toXML ?  [:greenleaf]


Message édité par SBAM le 08-04-2006 à 03:55:27
Reply

Marsh Posté le 08-04-2006 à 10:27:37    

c'est normal, la version avec argument masque l'autre.

Reply

Marsh Posté le 08-04-2006 à 10:34:08    

void Message::toXML( XMLWriter& writer ) masque les noms toXML dans tout les sub-object -- la supplantation de la fonction virtuelle est toutefois bien considérée. Ce qui fait que std::string BaseMessage::toXML() n'est pas considérée.
 
Je ne suis pas sur à 100% de l'explication. C'est une question que je me suis souvent posée, et j'y répond comme ça, j'espère que c'est correct.
 
Une bonne façon de procéder :
 

Code :
  1. class BaseMessage
  2. {
  3. public:
  4.         std::string toXML();
  5.         void toXML(XMLWriter& writer) { doToXML( writer ); }
  6. private:
  7.         virtual void doToXML( XMLWriter& writer ) = 0;
  8. };
  9. class Message : public BaseMessage
  10. {
  11. private:
  12.         virtual void doToXML(XMLWriter& writer);
  13. }


   

Reply

Marsh Posté le 08-04-2006 à 10:57:02    

bof, le mieux c'est de trouver un meilleur nom : là tes 2 fonctions n'ont ni le même type de retour, ni les mêmes arguments. renomme en writeXMLTo(writer)

Reply

Marsh Posté le 08-04-2006 à 14:23:08    

Oui je crois que je vais opter pour un autre nom, c'est plus facile. Mais ça m'était jamais arriver ce "masquage". Je commençais à plus rien n'y comprendre. Merci en tout cas.

Reply

Marsh Posté le 08-04-2006 à 19:17:35    

Question relative au design.
 
Comment feriez vous pour gérer plusieurs modes de sérialisation pour le même objet parmi les formats XML, CSV, binaire par exemple ?

Reply

Marsh Posté le 08-04-2006 à 19:27:51    

regardes Boost.Serialization, il y a 3 types d'archives, qui utilisent une fonction serialize() membre ou non de la classe dont on veut en sérialiser une instance.

Reply

Marsh Posté le 09-04-2006 à 10:28:23    

Ok
 
Pour la postérité:
http://www.boost.org/libs/serialization/doc/index.html


Message édité par slash33 le 09-04-2006 à 10:34:29
Reply

Sujets relatifs:

Leave a Replay

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