Bonjour,
J'ai dans une classe (B) plusieurs fonctions virtuelles surchargées (Init() et Init(int)).
J'ai voulu redéfinir dans une de ses classes filles (D) une seule de ces fonctions(Init()). Et j'ai obtenu un warning (sous solaris) que je ne comprends pas bien :
Warning: D::Init hides the virtual function B::Init(int).
Et effectivement, j'ai une erreur de compilation quand je fais monD->Init(0).
Donc si je comprends bien, si on ne redéfinit dans la classe fille qu'une seule des fonctions répondant au nom de Init, on perd l'accès aux autres fonctions de même nom mais de signature différente de la classe mère ?
Comment ça se fait ? Est-ce que du coup, on est obligé de redéfinir toutes les surcharges de la fonction en appelant à chaque fois celle de la classe mère ?
De plus, si ma classe D est définie comme ça class D : public virtual B, je n'ai plus le warning, mais je n'ai cependant toujours pas accès à monD->Init(0). Pourquoi dans ce cas, le warning a-t-il disparu ?
Merci d'avance,
Marie.
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 <stdio.h> #include <iostream> #include <string> class B { public: virtual void Init(int); virtual void Init(); }; void B::Init(int){ std::cout<<"B init int"<<std::endl; } void B::Init(){ Init(0); std::cout<<"B init"<<std::endl; } class D: public B { public: virtual void Init(); }; void D::Init(){ std::cout<<"D init"<<std::endl; } int main (void) { B* monB = new D ; D* monD = new D; monB->Init(0); monB->Init(); monD->Init(); //monD->Init(0); monD->B::Init(0); return (0); }
Partager