6

Türetilmiş bir sınıf için farklı parametre listeleri ile eşit olarak adlandırılan iki yöntem miras almaya çalışıyorum. Bunlardan biri türetilmiş sınıfta sanal ve geçersizdir, diğeri sanal değildir. Bunu yapmak için, türetilmiş bir sınıf nesnesinden temel sınıfın sanal olmayan yöntemine erişmeye çalışırken bir derleme hatası alıyorum. C++ 'da bir uzman değilimC++: aşırı yüklenmiş sanal olmayan yöntem ve sanal yöntem her ikisi de aynı ada sahip sorun neden

error: no matching function for call to ‘Deriv::f()’
note: candidates are: virtual void Deriv::f(int)

, ama şimdiye kadar varsayım yapımında doğru olduğu düşünülen: Burada

aşağıdaki derleme hatasına üretir kod parçacığı

class Base { 
public: 
    void f() { 
     cout << "[Base::f()]" << endl; 
    } 

    virtual void f(int arg) { 
     cout << "[Base::f(" << arg << ")]" << endl; 
    } 
}; 


class Deriv : public Base { 
public: 
    virtual void f(int arg) { 
     cout << "[Deriv::f(" << arg << ")]" << endl; 
    } 
}; 


int main() { 
    Deriv d; 
    d.f(-1);  
    d.f(); // <<-- compile error 
    return 0; 
} 

olduğunu Bu üye yöntemleri imzaları ile tamamen ayırt edilebilir. Böylece, sanal olmayan yöntem Base :: f() geçersiz kılınmamalı ve erişilebilir kalmalıdır. Bununla yanlış mıyım? İşte

bazı ilginç/ek konuda yorumlar şöyle:

    - (int arg) yanı olmayan sanal olabilir bastıran metod Deriv :: f; hata
    her iki şekilde gerçekleşir - Hata/atlatılabilir kaybolur ...
      ... zaman Taban :: f geçersiz kılma değil ... Baz sınıfına
      için Deriv nesnesini döküm yoluyla (int arg) Deriv'de
      ... "Base :: f;" komutunu ekleyerek Zaten bu derleme hatası önlemek için biliyorum çünkü Yani DERIV

kamu kısmına, bu hata olur nedenağırlıklı ilgileniyorum! Lütfen bana bu konuda ışık tutmak için bana yardım edin ...

Teşekkürler advanvce! emme

Deriv yılında
+0

"... Deriv'in public kısmına" Base :: f; "komutunu ekleyerek," Base :: f; arasında – Tomaka17

+0

olası yinelenen [C bir üs Aşırı Yükleme Fonksiyonu geçersiz kılma ++] (http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c) Tomaka17 @ –

+0

: Hayır, tam olarak demek : satırı Base :: f; Sınıfa . Ama açıkçası bu, ".. .. kullanma" komutuyla aynıdır. – Emme

cevap

7
+0

Evet, bunu zaten biliyorum (kod snippet'in altındaki yorumlarıma bakın). ama bunu neden eklemek zorundayız ve bu ne yapıyor? – Emme

+0

tamam, bu bağlantı için çok teşekkürler! çok yardımcı oldu! – Emme

2

Türetilmiş sınıf fonksiyonu:

using Base::f; 

@DumbCoder tarafından verilen bağlantısına ek olarak, benzer bir soruya cevabım daha fazla ayrıntı bulabilirsiniz Temel işlev tanımını gizler. Detailed explaination as to why ve how

+1

"adı gizleme" google isteyebilirsiniz "resmi" bir terimdir. –