SORU
27 EKİM 2009, Salı


Neden türetilmiş bir sınıfta geçersiz kılınmış bir işlevi temel sınıf diğer aşırı sakladı mı?

Düşünün kodu :

#include <stdio.h>

class Base {
public: 
    virtual void gogo(int a){
        printf(" Base :: gogo (int) \n");
    };

    virtual void gogo(int* a){
        printf(" Base :: gogo (int*) \n");
    };
};

class Derived : public Base{
public:
    virtual void gogo(int* a){
        printf(" Derived :: gogo (int*) \n");
    };
};

int main(){
    Derived obj;
    obj.gogo(7);
}

Bu hata var :

>g   -pedantic -Os test.cpp -o test
test.cpp: In function `int main()':
test.cpp:31: error: no matching function for call to `Derived::gogo(int)'
test.cpp:21: note: candidates are: virtual void Derived::gogo(int*) 
test.cpp:33:2: warning: no newline at end of file
>Exit code: 1

Buradan, Türetilmiş bir sınıf işlevi temel sınıf olarak aynı adı (imza değil) tüm fonksiyonları örten. Her nasılsa, C bu tavrı, TAMAM görünmüyor. Polimorfik değil.

CEVAP
27 EKİM 2009, Salı


Sorunuzun ifade (kelime kullandın"") gizlemek, sana burada neler oluyor. zaten biliyorum yargılamak Fenomen denir "adını gizleme". Nedense, ne zaman biri hakkında bir soru sorarnedenadı saklanmak olur, kim yanıt da demek ki bu "isim gizleme" ve açıklamak nasıl çalışır (bildiğiniz) veya açıklamak için geçersiz (ki ben bilmiyordum), ama kimse için bakım için adres gerçek "neden" sorusu.

Karar, adı arkasına saklanarak mantığı yaninedenaslında tasarlanmıştır C , önlemek için bazı mantığa aykırı, beklenmedik ve potansiyel olarak tehlikeli davranış olabilir gerçekleşmesi halinde miras set yüklenmiş işlevleri vardı izin karışımı ile geçerli kümesi aşırı verilen sınıf. Muhtemelen C aşırı çözümleme çalışan aday kümesinden en iyi işlevi seçerek. Bu parametre türleri için bağımsız değişken türleri eşleştirerek yapılır. Eşleştirme kuralları zaman karmaşık ve hazırlıksız bir kullanıcı tarafından mantıksız olarak algılanan olabilir sık sık sonuçlara neden olabilir. Daha önce mevcut bir dizi yeni fonksiyon ekleme aşırı çözümleme sonuçları oldukça köklü bir değişime neden olabilir.

Örneğin, diyelim ki temel sınıf B sahip bir üye fonksiyonu foo alır bir parametre türü void * ve tüm aramalar için foo(NULL) çözüldü B::foo(void *). Hadi isim gizleme yok ve B::foo(void *) birçok farklı sınıflar B azalan görünür olduğu görüşünde. Ancak, hadi [] dolaylı, uzaktan bazı alt sınıf D B fonksiyon foo(int) tanımlı olduğunu söylüyor. Şimdi, adını saklamadan D foo(void *) foo(int) görünür ve aşırı çözümleme katılan hem de vardır. Hangi işlev çağrıları türde bir nesne D yapılan foo(NULL) gidermek için? int herhangi bir işaretçi türü daha ayrılmaz sıfır için daha iyi bir eşleşme (yani NULL) olduğundan D::foo(int) gidermek. Hiyerarşik bir fonksiyon için foo(NULL) çözmek için görüşmeleri boyunca, D (ve altında) ise aniden başka gidermek.

Bu davranış dilini tasarlarken istenmeyen görüldü. Daha iyi bir yaklaşım olarak, "name" şartname, her sınıf "" ilan eder, her yöntemin adı saygı ile. temiz bir sayfa ile başlar, yani saklanma izleyin karar verildi Bu davranışı geçersiz kılmak için, açık bir eylem kullanıcıdan gereklidir: aslında devralınan yöntem(ler) (şu anda) kaldırılmış bir redeclaration,-beyanname kullanarak açık bir kullanın şimdi.

Doğru orijinal yazı ("Değil" yorumu), bu davranış, BİR sınıf arasındaki ilişkiyi kurabilir ihlali olarak görülebilir polimorfik. bahsediyorum olduğu gibi Bu doğrudur, ama görünüşe göre o zamanlar son isim gizleme kötünün iyisi olacağına karar verildi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009
  • MADFINGER Games a.s.

    MADFINGER Ga

    21 NİSAN 2009
  • OVERWERK

    OVERWERK

    6 Temmuz 2010