Comment puis-je appeler dinamiquement fonction de la forme: childA.function(childB)
alors que leurs types statiques sont les deux parents?Comment appeler fonction dynamiquement avec l'argument de polymorphisme
et avec plus de détails:
J'ai un projet physique où je dois calculer le potentiel de 2 molécules. Mais j'ai 2 types de molécules, LC et Col, et chaque type a ses propres paramètres et d'autres choses, mais je veux être capable d'appeler dynamiquement le potentiel de chaque molécule.
donc j'ai essayé ceci:
#include <iostream>
#include <typeinfo>
#include <stdio.h>
using namespace std;
class Col;
class LC;
class Molecule
{
public:
/// more data and functions should be here regarding the molecule
double someBulshit;
virtual double potential(const Molecule * mol){}
virtual double potential(const Col * mol){}
virtual double potential(const LC * mol){}
};
class LC : public Molecule
{
public:
/// more data and functions should be here regarding the LC molecule
virtual double potential(const Molecule * mol) {return 1;}
virtual double potential(const LC * mol) {return 2;}
virtual double potential(const Col * mol) {return 3;}
};
class Col : public Molecule
{
public:
/// more data and function should be here regarding the Col molecule
virtual double potential(const Molecule * mol) {return 4;}
virtual double potential(const LC * mol) {return 5;}
virtual double potential(const Col * mol) {return 6;}
};
int main(int argc, char* argv[])
{
Molecule * mol1 = new Col();
Molecule * mol2 = new LC();
double my_potential = mol1->potential(mol2);
printf ("%f",my_potential);
}
Mais j'obtenir le résultat de 4, il se trouve que la fonction est appelée de façon statique, ce qui signifie que, puisque le type statique de mol1 est Molecule la fonction appelée est:
virtual double potential(const Molecule * mol) {return 4;}
et non
virtual double potential(const LC * mol) {return 5;}
est-il de toute façon d'appeler la fonction Dyna mically (dans la conception OOP) sans l'utilisation de typeid en elle?
réponse complète:
Après enquête avec Peter conseils ce se révéler être un problème à double expédition classique, la solution complète est juste d'appeler dans un autre virtuel similaire virtuel ceci:
#include <iostream>
#include <typeinfo>
#include <stdio.h>
using namespace std;
class Col;
class LC;
class Molecule
{
public:
/// more data and functions should be here regarding the molecule
double someBulshit;
virtual double potential(const Molecule * mol) const = 0;
virtual double potential(const Col * mol) const = 0;
virtual double potential(const LC * mol) const = 0;
};
class LC : public Molecule
{
public:
/// more data and functions should be here regarding the LC molecule
virtual double potential(const Molecule * mol) const {return mol->potential(this);}
virtual double potential(const LC * mol) const {return 2;}
virtual double potential(const Col * mol) const {return 3;}
};
class Col : public Molecule
{
public:
/// more data and function should be here regarding the Col molecule
virtual double potential(const Molecule * mol) const {return mol->potential(this);}
virtual double potential(const LC * mol) const {return 5;}
virtual double potential(const Col * mol) const {return 6;}
};
int main(int argc, char* argv[])
{
Molecule * mol1 = new Col();
Molecule * mol2 = new LC();
double my_potential = mol1->potential(mol2);
printf ("%f",my_potential);
}
et cela renvoie effectivement 3 comme souhaité.
Votre code source ne compile pas. Les coupables sont les fonctions membres de Molecule. Vous pouvez également renommer le membre de données "Molecule". Peut-être avez-vous oublié de faire ces choses virtuelles? Les fonctions ne sont pas appelées statiquement. Veuillez fournir un [MCVE] (https://stackoverflow.com/help/mcve). – Ron
Recherchez le modèle de visiteur. – Peter