Bonjour,
Quelqu'un pourrait-il m'expliquer pourquoi il est obligatoire de déclarer un constructeur B(int) (la question du gros flemmard) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 struct A { A(int) {} void test(); }; struct B : public A {}; void test() { A a(3); B b(3); // error no matching constructor for B(int) B b(); b.test(); // Ok --> jalousie : pourquoi A::test est-il accessible et pas A::A()? }
En effet la sémantique de l'héritage est "est un" et donc, pour un héritage public, je m'attends à ce que TOUS les membres public et protected soient accessibles directement dans ma classe fille (selon leur classe d'accès bien sur), d'où ma question : Pourquoi tant de haine?
Ca a une importance pour moi par rapport aux template, dans la mesure où on ne peut pas spécialiser explicitement les using :
Je me suis dit que je pourrais remplacer par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 template <typename t> using B = UneDefinition<t> template <> using B<test> = A<test,autres paramètres>; // Erreur spécialisation explicite d'un 'using' interdite // interdit, c'est pourtant ce dont j'aurais besoin
Mais ça m'impose de redéclarer tous les constructeurs et ça me dérange (lourdeur, maintenance), d'où ma question.
Code : Sélectionner tout - Visualiser dans une fenêtre à part template <> struct B<test> : public A<test, autres paramètres> {};
Merci par avance pour vos réponses.
Partager