IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

methodes virtuelles + héritage multiple = collisions


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Par défaut methodes virtuelles + héritage multiple = collisions
    bonjour à tous

    j'ai un petit problème qui est le suivant : dans le cas d'un héritage multiple, comment faire quant on a des collisions (?) de nom de methodes virtuelles ?

    example :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class Server {
     ...
     public virtual void receivedPacket(char* packet, int size) = 0;
    };
     
    class Client {
     ...
     public virtual void receivedPacket(char* buffer, int size) = 0;
    };
     
    class TestServer : public Server {
     public void receivedPacket(char* buffer, int size) {}
    };
     
    class TestClient : public Client {
     public void receivedPacket(char* buffer, int size) {}
    };
    jusque là tout est bien
    maintenant je veux faire un serveur non dédié, càd qui soit Client et Serveur en meme temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class TestNonDedicatedServer : public Server, Client {
     
     // bon alors c'est le serveur ou le client qui recoit le packet ?
     public void receivedPacket(char* buffer, int size) {}
    };
    vous voyez ?
    vous vous doutez bien que je ne veux pas renommer mes methodes en receivedPacket_Server ou ajouter un argument ou je ne sais quoi de sémantiquement inacceptable...

    merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Voir l'héritage virtuel.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne vois pas trop ce que l'héritage virtuel peut résoudre dans ce cas. La solution passe souvent dans ce genre de situation par la création de classes intermédiaires (NonDedicatedServerServerSide et NonDedicatedServerClientSide par exemple, qui chacunes redéfinissent la fonction virtuelle, et la classe NonDedicatedServer qui hérite de ces deux classes intermédiaires).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Par défaut
    je vois ce que tu veux dire JolyLoic (en gros "rediriger" les methodes qui entrent en collision), c'est un poil décevant quant meme qu'il n'y ait pas un moyen plus simple, du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public void (Client) receivedPacket(char* buffer, int size) {}
    public void (Server) receivedPacket(char* buffer, int size) {}
    pas la peine d'essayer hein

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    En fait ça marche très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
     
    struct Server
    {
    	virtual void receive() = 0;
    };
     
    struct Client
    {
    	virtual void receive() = 0;
    };
     
     
    struct TestNonDedicatedServer : public Server, public Client
    {
    	void receive()
    	{
    		std::cout << "TestNonDedicatedServer::receive" << std::endl;
    	}
    };
     
    int main()
    {
    	TestNonDedicatedServer s;
    	static_cast<Server&>(s).receive();
    	static_cast<Client&>(s).receive();
    }
    Aucun problème.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Passer par des classes intermédiaires permet de fournir un comportement différent quand on utilise cet objet depuis une interface serveur ou une interface client.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Par défaut
    Citation Envoyé par loufoque
    En fait ça marche très bien
    en fait la fonction receive() est appellée depuis Server et Client, donc pour les cast c'est loupé
    je met résolu, JolyLoic a raison

    j'ai fait comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class NonDedicatedServerServerSide : public Server {
    public:
       void receive(char* b, int s)  { ... }
    };
     
    class NonDedicatedServerClientSide : public Client {
    public:
       void receive(char* b, int s)  { ... }
    };
     
    class NonDedicatedServer : public NonDedicatedServerServerSide, NonDedicatedServerClientSide {
       ...
    };

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nico65
    vous vous doutez bien que je ne veux pas renommer mes methodes en receivedPacket_Server ou ajouter un argument ou je ne sais quoi de sémantiquement inacceptable...
    Mais en catégorisant la fonction ca ne marche pas ?

    Un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class TestNonDedicatedServer : public Server, Client {
     
     public void Server::receivedPacket(char* buffer, int size) {}
     public void Client::receivedPacket(char* buffer, int size) {}
    };
    Désolé j'ai pas vérifié, mais c'était un truc du genre je crois bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Héritage multiple et fonction virtuelle
    Par chronos dans le forum Langage
    Réponses: 5
    Dernier message: 17/02/2012, 10h15
  2. Héritage multiple et fonction virtuelle
    Par chronos dans le forum C++/CLI
    Réponses: 0
    Dernier message: 14/02/2012, 09h59
  3. Réponses: 6
    Dernier message: 26/10/2010, 11h33
  4. Héritage multiple virtuel
    Par Kant2006 dans le forum C++
    Réponses: 19
    Dernier message: 15/06/2006, 14h54
  5. Réponses: 19
    Dernier message: 10/02/2005, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo