Bonjour,

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()?
}
Quelqu'un pourrait-il m'expliquer pourquoi il est obligatoire de déclarer un constructeur B(int) (la question du gros flemmard) ?
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 :
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
Je me suis dit que je pourrais remplacer par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
template <> struct B<test> : public A<test, autres paramètres> {};
Mais ça m'impose de redéclarer tous les constructeurs et ça me dérange (lourdeur, maintenance), d'où ma question.

Merci par avance pour vos réponses.