la conversion de dérivé * en base * existe mais est inaccessible

88

Pourquoi le code suivant produit-il cette erreur même si c est une structure et a un héritage public par défaut?

struct c 
{
protected:
    int i;
public:
    c(int ii=0):i(ii){}
    virtual c *fun();
};

c* c::fun(){
    cout<<"in c";
    return &c();
}

class d : c
{
 public:
    d(){}
    d* fun()
    {
        i = 9;
        cout<<"in d"<<'\t'<<i;
        return &d();
    }
};


int main()
{
    c *cc;
    d dd;
    cc = &dd;
    cc->fun();
}
user1232138
la source

Réponses:

168

Vous avez besoin:

class d : public c

classl'héritage est privatepar défaut.

Lorsque vous héritez en privé de a classou a struct, vous dites explicitement, entre autres, que la conversion directe d'un type dérivé en un type de base n'est pas possible.

Luchian Grigore
la source
M. Grigore une fois de plus pour la victoire. Merci Monsieur! Vos réponses aident vraiment!
M.Ionut