Conversion from Derived** to Base**

后端 未结 3 718
终归单人心
终归单人心 2020-12-01 20:59

I was reading this and unfortunately could not understand in depth why the compiler does not allow conversion from Derived** to Base**. Also I have seen this which gives no

3条回答
  •  攒了一身酷
    2020-12-01 21:40

    There are no shortage of senseless errors this would permit:

    class Flutist : public Musician
    ...
    
    class Pianist : public Musician
    ...
    
    void VeryBad(Flutist **f, Pianist **p)
    {
     Musician **m1=f;
     Musician **m2=p;
     *m1=*m2; // Oh no! **f is supposed to be a Flutist and it's a Pianist!
    }
    

    Here is a full working example:

    #include 
    
    class Musician
    {
     public:
     Musician(void) { ; }
     virtual void Play(void)=0;
    };
    
    class Pianist : public Musician
    {
     public:
     Pianist(void) { ; }
     virtual void Play(void) { printf("The piano blares\n"); }
    };
    
    class Flutist : public Musician
    {
     public:
     Flutist(void) { ; }
     virtual void Play(void) { printf("The flute sounds.\n"); }
    };
    
    void VeryBad(Flutist **f, Pianist **p)
    {
     Musician **m1=f;
     Musician **m2=p;
     *m1=*m2; // Oh no! **f is supposed to be a Flutist and it's a Pianist!
    }
    
    int main(void)
    {
     Flutist *f=new Flutist();
     Pianist *p=new Pianist();
     VeryBad(&f, &p);
     printf("Mom is asleep, but flute playing wont bother her.\n");
     f->Play(); // Since f is a Flutist* this can't possibly play piano, can it?
    }
    

    And here it is in action:

    $ g++ -fpermissive verybad.cpp -o verybad
    verybad.cpp: In function void VeryBad(Flutist**, Pianist**):
    verybad.cpp:26:20: warning: invalid conversion from Flutist** to Musician** [-fpermissive]
    verybad.cpp:27:20: warning: invalid conversion from Pianist** to Musician** [-fpermissive]
    $ ./verybad 
    Mom is asleep, but flute playing wont bother her.
    The piano blares
    

提交回复
热议问题