J'ai rencontré un problème avec mes classes, en passant un objet const (structure polymorphe) à un constructeur explicite qui prend une référence const à la classe de base de cette structure polymorphe. Voici l'échantillon (ce n'est pas de mon code, il est pour l'explication ici)Passage explicite d'un objet const à un constructeur qui prend la référence const à une classe polymorphe
class Base
{
...
}
class Derived:public Base
{
...
}
class Problem
{
Problem(const Base&);
...
}
void myFunction(const Problem& problem)
{
...
}
int main()
{
//explicit constructor with non const object
Derived d;
Problem no1(d); //this is working fine
myFunction(no1);
//implicit constructor with const object
Problem no2=Derived(); //this is working fine, debugged and everything called fine
myFunction(no2); //is working fine
//explicit constructor with const object NOT WORKING
Problem no3(Derived()); //debugger jumps over this line (no compiler error here)
myFunction(no3); //this line is NOT COMPILING at all it says that:
//no matching function for call to myFunction(Problem (&)(Derived))
//note: candidates are: void MyFunction(const Problem&)
}
Il semble que cela fonctionne très bien avec la deuxième version (explicite appel constructeur de problème) que si je rejetterai explicitement la objet dérivé de sa classe de base de base comme il:
Problem(*(Base*)&Derived);
Je ne réalise pas la différence entre l'appel impicitly et explicitement le constructeur de la classe de problème. Merci!
Vous avez activé "Base" et "Derived" dans votre déclaration de deuxième classe. Est-ce une faute de frappe? De plus, le commentaire "débogueur saute-t-il sur cette ligne" s'applique-t-il même lorsque vous compilez dans un profil 'Debug' sans optimisations? –
Vous créez des objets de la classe de base et vous les transmettez - vous n'obtiendrez pas de comportement polymorphe. Vous avez besoin d'une référence ou d'un pointeur vers une classe de base pour obtenir le comportement souhaité. Casting n'est pas une solution. – dirkgently
Le paramètre est la référence const, donc il y a la référence pour le comportement polymorphique. – user265149