Kalıtım, sanal işlevler ve işlev aşırı yüklenmesini anladığımı sanıyordum, ancak bu özellikler arasındaki etkileşim hakkında bir şeylerin beni uyandırdığı bir durum var.Aşırı yüklü sanal işlevler kümesinin kısmi kalıtımı
ben aşırı yüklenmiş bir sanal işlevi içeren basit bir temel sınıf ve ondan türetilen ikinci bir sınıf var varsayalım:
class b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 2; }
};
class d : public b {
public:
virtual int f(int) { return 3; }
};
Bildirim türetilmiş sınıfa o d
geçersiz kılmaları aşırı sanal fonksiyonlarının tek.
ben sınıfın d
bir nesne örneğini ve üzerinde hiçbir problem f(int)
çağırabilirsiniz:
d x;
std::cout << x.f(0) << std::endl;
Ama çalıştığınızda 0-argüman işlevi çağırmak için: İşlem başarısız
std::cout << x.f() << std::endl;
! gcc, "d :: f() 'öğesine çağrı için eşleme işlevi yok"; adaylar şunlardır: virtual int d :: f (int) ". clang diyor ki, "çağrıya cevap vermek için çok az argüman var, beklenen 1, 0 tane var mı?" demek istediniz "b :: f"? " d
, 0-argüman f()
yöntemine sahip olan b
'dan türetilmiş olsa da, derleyici bunu görmezden gelir ve bunun yerine d
'1 argüman yöntemini çağırmaya çalışır.
:
class d : public b {
public:
virtual int f() { return 1; }
virtual int f(int) { return 3; }
};
Veya, clang en hata mesajı önerdiği gibi, ben aptal bir netleştirme sözdizimi ben asla kullanabilirsiniz
std::cout << x.b::f() << std::endl;
Ama benim soru, ben kırdınız ne kuralı ve bu kuralın/zorlamak korumaya çalıştığı şey/savunmak: çalışacak tahmin? Burada yapmaya çalıştığımı sandığım şey, mirasın ne demek olduğunu düşündüğüm şeydi.
bu konunun çok iyi bir tartışma için Başvuru http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class -hide-diğer-aşırı-of-the – blade