Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Question. Une fois qu'une fonction virtuelle avec un ensemble spécifique de paramètres et de types est déclarée dans une classe parent, le nombre et les types de paramètres des fonctions virtuelles correspondantes peuvent-ils être modifiés dans les classes enfants ?
D'une part, le Manuel de référence indique qu'"une fonction virtuelle peut être substituée dans une classe dérivée . Lechoix de ladéfinition de fonction à appeler pour la fonction virtuelle est fait dynamiquement (au moment de l'exécution). Un cas typique est celui où une classe de base contient et les classes dérivées ont leurs propres versions de cette fonction". En revanche, les exemples donnés dans le Manuel de référence font référence à des cas où les fonctions virtuelles ont des corps de définition de fonction différents plutôt que des en-têtes de définition de fonction.
D'aussi loin que je me souvienne, c'est possible. Mais il faut faire très attention aux types et au nombre de paramètres.
Vous devez également faire attention aux types de valeurs transmises et aux valeurs par défaut.
Voici quelques exemples pour plus de simplicité.
Cette variante fera l'affaire.
Celui-ci ne fonctionne pas (ou plutôt, il fonctionnera peut-être, mais avec quelques bogues et certaines réserves).
Il se passe exactement la même chose lorsque vous rechargez des méthodes à l'intérieur d'une classe.
Une copie exacte de la définition, à l'exception des paramètres par défaut (les paramètres par défaut peuvent varier, mais il est préférable de ne pas les utiliser).
Intéressant, si je comprends bien, la virtualisation de fonctions et la surcharge de fonctions sont des choses légèrement différentes. Etmql5 dit que dans la virtualisation des fonctions, il doit y avoir une copie papier de l'en-tête de la fonction (je ne prends pas en compte les paramètres par défaut).
Intéressant, si je comprends bien, la virtualisation de fonctions et la surcharge de fonctions sont des choses un peu différentes. Etmql5 dit que dans la virtualisation des fonctions, il doit y avoir une copie papier de l'en-tête de la fonction (je ne prends pas en compte les paramètres par défaut).
> Question. Après la déclaration d'une fonction virtuelle avec un certain ensemble de paramètres et leurs types dans une classe mère, est-il possible de changer le nombre et les types de paramètres des fonctions virtuelles correspondantes dans les classes descendantes ?
Si je comprends bien, l'enfant doit surcharger la fonctionnalité de l'ancêtre.
Pour être franc, je ne me souviens pas avoir fait ce genre de choses avec virtual (je pense l'avoir fait), mais l'affirmation concernant la surcharge est vraie - j'ai moi-même fait cette erreur une fois.
PS
Si tout est fait correctement, comme je le comprends, le nombre de paramètres peut être augmenté ou diminué. Les difficultés seront si le nombre de paramètres reste le même, mais que leurs types sont modifiés...
Bref, j'ai esquissé cet exemple :
Il s'avère qu'indépendamment du fait qu'une méthode de fonction soit surchargée ou non dans la classe C_C, une fonction virtuelle peut être appelée avec seulement trois paramètres - pointeur.function(a1,a2,a3). Par conséquent, le programme n'atteindra jamais la méthode à deux paramètres de la classe C_C lors de l'appel des fonctions virtuelles. N'est-ce pas ?
Bref, j'ai esquissé cet exemple :
Il s'avère qu'indépendamment du fait qu'une méthode de fonction soit surchargée ou non dans la classe C_C, une fonction virtuelle peut être appelée avec seulement trois paramètres - pointeur.function(a1,a2,a3). Par conséquent, le programme n'atteindra jamais la méthode à deux paramètres de la classe C_C lors de l'appel des fonctions virtuelles. N'est-ce pas ?
Analysez ce que fait le programme en insérant dans les constructeurs et les destructeurs des impressions avec la macro __FUNCTION__, ce sera très utile.
J'ajouterais également qu'en déclarant un pointeur vers une classe de base, vous construisez ainsi un "tunnel" vers les descendants à travers la classe de base. Ainsi, le compilateur ne verra que les fonctions déclarées dans la classe de base dans les classes descendantes. Si vous (même dans le même programme) déclarez directement un objet descendant, toutes les fonctions seront disponibles dans celui-ci.
Bref, j'ai esquissé cet exemple :
Il s'avère qu'indépendamment du fait qu'une méthode de fonction soit surchargée ou non dans la classe C_C, une fonction virtuelle peut être appelée avec seulement trois paramètres - pointeur.function(a1,a2,a3). Par conséquent, le programme n'atteindra jamais la méthode à deux paramètres de la classe C_C lors de l'appel des fonctions virtuelles. N'est-ce pas ?
D'après ma propre expérience, je peux vous recommander d'emballer le code de la manière suivante
Et vous pouvez voir le fichier joint à titre d'exemple et de divertissement.
Je ne voulais pas m'embêter avec les pointeurs et les nouveaux, donc j'ai simplement déclaré la classe de travail comme une variable.
Le conseiller expert génère un nombre aléatoire 0/1 à intervalles égaux et, en fonction du résultat, exécute l'une des deux fonctions suivantes : MarketBuy / MarketSell.
Vous pouvez le faire de cette façon si vous voulez
Mais dans ce cas, un bogue peut se produire à cause du conflit avec
PS
Je l'ai fait à la main, c'est pourquoi il peut y avoir quelques inexactitudes.
Mais en principe, l'idée de base peut être comprise.
Merci beaucoup pour ces précieux conseils et orientations ! Je les utiliserai certainement, mais j'aimerais avoir suffisamment de temps pour la théorie et la pratique.
De ma propre expérience, je peux recommander de compléter ainsi le code
Pourquoi est-ce que c'est comme ça ? Quel est le piège ?
Il y avait un problème avec ça, je crois. Mais je ne me souviens plus lesquelles.
Bref, je m'y suis habitué.
En général, il n'y a pas de différence bien sûr, du moins dans mon exemple, j'ai essayé de permuter les places et tout a fonctionné...
Il y avait un problème avec ça, je crois. Mais je ne me souviens plus lesquelles.