2014-06-13 21 views
14

Ben sanal bir işlevi geçersiz zaman? hiç fark yapar mı? Her iki yolun da iyi çalıştığını biliyorum, sadece bundan daha fazlası var mı diye merak ediyorum. C++ 11 kullanıyorsanızBir C++ işlevini geçersiz kıldığımda tekrar 'sanal' belirtmeli miyim?</p> <pre><code>class Geoff { public: virtual int getArea() { return 0; } } </code></pre> <p>ben bunu geçersiz tekrar 'sanal' belirtmeli:

class George : public Geoff 
{ 
public: 
    virtual int getArea() { return x*y; } 
} 
+0

Bu bir dupe değil, ama kesinlikle alakalı. –

+0

@ 一 二三: Bu bir çift için zayıf bir aday, çünkü sanal bir anahtar kelimeyi kullanarak *** bir işlevini *** yerine "değiştirebilir" diye soruyor (iyi cevaplar gizleme ve sanal gönderme arasındaki farkı açıklıyor) . –

+1

@TonyD - Gördüğünüz bir yarışmadır, soruyu sorgulamayan bir kişi haline getirerek, ya da kapanış sorusunu tamamen yanıtlayan ilk kişi olmaktır. ; -P –

cevap

26

, size bir uyan sanal işlevi geçersiz kılma için bir üs bulunan bir sanal fonksiyon ve kontrolleri geçersiz olduğunuz her iki belgede, bunun yerine override kullanmalıdır. C++ 03 bir üslup seçim yılında

int getArea() override { return x*y; } 

- Eğer dokümantasyon değer katmaktadır hissetmiyorsanız içinde virtual koydu.

+2

Ayrıca, daha fazla geçersiz kılmayı önlemek için 'final' özelliğini de kullanabilirsiniz ve bu, derleyicinin bu üye işlevine yapılan çağrıları daha kolay yönlendirebilmesini sağlar. –

+1

Eğer GEORGE'nin genişletileceğini biliyorsanız, bununla birlikte sanallaştırın. Anlama amacı için. –

+1

@ Al-mo Üzgünüm, ama bu kötü bir tavsiye. "Geçersiz kıl", yöntemin sanal olduğunu göstermek için yeterince açık. –

7

Hayır, değerini geçersiz kıl kullanın. (http://en.cppreference.com/w/cpp/language/override)

Yöntem ebeveynte sanal değilse, başarısız olma avantajı vardır. Mark belirttiği gibi imza aynı değilse sanal sessizce "başarılı" olur oysa

düzenlemek

, aynı zamanda, başarısız olur. Korku alıntıları, eşleşmeyen bir imzanın tabandaki gölgeli yöntemi gizlemesi ve ilgisiz yeni bir sanal yöntem yapmasıdır.

+1

Ayrıca, geçersiz kılma yönteminin geçersiz kılınan yöntemle uyumlu bir imzasına sahip olup olmadığını da denetler (aslında bu yöntemi geçersiz kılar, evet). –

+0

@MarkGarcia Bu doğru ve iyi bir nokta, çünkü geçersiz kılmaya çalışırken yanlışlıkla aşırı yüklenmek istemezsiniz. –

+0

Teşekkürler, geçersiz kılma hala VS2010'da benim için bir uyarı oluşturuyor, bu yüzden mimarlarımızla ona bakmak zorunda kalacağım. –

İlgili konular