2014-09-11 38 views
5

Açıklamada ne yapıldığını kullanmadan sanal işlev foo (int) B'yi çağırmak mümkün mü?C++ polimorfizm ve sanal işlev

class A { 
public: 

    virtual void foo (char *) { 
    } 

    virtual void foo (int) { 
    } 
}; 

class B : public A { 
public: 

    void foo (char *) { 
    } 

    //void foo (int i) { 
    // 
    // A::foo(i); 
    //} 
}; 

B b; 
b.foo(123); // cannot convert argument 1 from 'int' to 'char *' 
+1

girintilemeyi düzeltin ..... ilk bakışta sanal sanal foo (int) 'nin beyanı' sanal boşluk foo (char *) 'nin bedeni gibi görünüyor. Derleyiciler tuhaf biçimlendirmeyi umursamayabilirler, ama insanlar bunu yaparlar. –

+1

@AndreKostur FWIW, 'foo' aşırı yüklenmelerinin tuhaf girintisi OP tarafından değil, bir editör tarafından tanıtıldı. – Angew

cevap

8

Evet, bu mümkündür. Buradaki sorun fonksiyonu B::foo(char*)miras işleve A::foo(int) ait adını gizler yani, ama bir using bildirimiyle B kapsamına içine geri getirebilir:

class B : public A { 
public: 

    void foo (char *) { 
    } 

    using A::foo; 
};