web-dev-qa-db-fra.com

C ++: Comment empêcher les noms privés de polluer les types dérivés?

J'ai été choqué aujourd'hui par le fait que cet extrait de code ait une référence de nom ambiguë:

class A
{
private:
    typedef int Type;
};

class B
{
public:
    typedef int Type;
};

class D : A, B
{
    Type value;//error: reference to 'Type' is ambiguous
};

Hmm! Imaginez que vous êtes l'auteur de la classe A et que votre classe a déjà été utilisée partout par différentes personnes et différents projets. Un jour, vous décidez de réécrire votre classe A. Cela ne signifie-t-il pas que vous ne pouvez pas utiliser de nouveau nom (même privé) dans votre nouvelle classe sans casser le code des autres?

Quelle est la convention ici?

14
zwhconst

Je ne vois aucun problème ici, ce n'est pas parce que c'est privé que le symbole n'existe pas. Si vous essayez d'accéder à un membre privé, le compilateur vous dit que vous ne pouvez pas y accéder, ce qui n'existe pas.

De plus, je dirais que c'est une mauvaise pratique d'utiliser l'héritage multiple et de ne pas qualifier complètement les symboles.

class D : A, B
{
    B::Type value;
};
0
Nop