Pourquoi est il plus propre d'utiliser MaClasse::methode() dans un prototype de MaClasse.class,
plutôt que this->methode ?
ps : ca marche aussi avec les arguments
Pourquoi est il plus propre d'utiliser MaClasse::methode() dans un prototype de MaClasse.class,
plutôt que this->methode ?
ps : ca marche aussi avec les arguments
Essaye ça et tu devrais avoir une piste pour comprendre:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include <iostream> class A { public: virtual void MaMethode() { std::cout<<"A::MaMethode"<<std::endl; } virtual void MaSecondeMethode() { std::cout<<"A::MaSecondeMethode"<<std::endl; } void MaisPourquoi() { std::cout<<"this->MaMethode()"<<std::endl; this->MaMethode(); std::cout<<"A::MaSecondeMethode()"<<std::endl; A::MaSecondeMethode(); } }; class B :public A { public: virtual void MaMethode() { std::cout<<"B::MaMethode"<<std::endl; } virtual void MaSecondeMethode() { std::cout<<"B::MaSecondeMethode"<<std::endl; } }; int main(int argc, char* argv[]) { B b; b.MaisPourquoi(); return 0; }
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
A priori je dirai que oui.
Et je ne dirai pas que l'un est plus propre que l'autre.
Ça dépend du comportement que tu veux. Si tu veux appeler la méthode du type réel de ta class (B), ou d'un de ces ancêtre spécifiquement.
Et quelle est la différence entre ces 2 versions ?J'ai l'impression que c'est juste une perte de lisibilité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 this->maMethode() maMethode() // tout court
Sinon, MaClasse::maMethode() n'est pas spécialement propre, puisqu'on désactive explicitement le polymorphisme.
Jette aussi un coup d'œil à ça.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Non, mais il faut se souvenir que l'opérateur de portée est utile en cas d'ambigüité sur les noms de méthode.
Le même programme qu'au-dessus mais avec une classe « Abis » identique à la classe « A » et de même génération :
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 #include <iostream> class A { public: virtual void MaMethode() { std::cout<<"A::MaMethode"<<std::endl; } virtual void MaSecondeMethode() { std::cout<<"A::MaSecondeMethode"<<std::endl; } void MaisPourquoi() { std::cout<<"A this->MaMethode()"<<std::endl; this->MaMethode(); std::cout<<"A::MaSecondeMethode()"<<std::endl; A::MaSecondeMethode(); } }; class Abis { public: virtual void MaMethode() { std::cout<<"Abis::MaMethode"<<std::endl; } virtual void MaSecondeMethode() { std::cout<<"Abis::MaSecondeMethode"<<std::endl; } void MaisPourquoi() { std::cout<<"Abis this->MaMethode()"<<std::endl; this->MaMethode(); std::cout<<"Abis::MaSecondeMethode()"<<std::endl; Abis::MaSecondeMethode(); } }; class B :public A , public Abis { public: virtual void MaMethode() { std::cout<<"B::MaMethode"<<std::endl; } virtual void MaSecondeMethode() { std::cout<<"B::MaSecondeMethode"<<std::endl; } }; int main(int argc, char* argv[]) { B b; // b.MaisPourquoi(); // Ambigü b.A::MaisPourquoi(); b.Abis::MaisPourquoi(); return 0; }
Partager