Üye türlerimi final
Java'da olduğu gibi yapmak mümkün müdür? Böylece türetilmiş sınıflar bunları geçersiz kılabilir mi?Bir sınıf için 'final' üye işlevleri nasıl tanımlanır
cevap
Gerçekte varsayılan davranış olması çok olasıdır. Yani sınıf örnek yöntemlerinizi açıkça virtual
olarak bildirmezseniz alt sınıflarda overridden olamaz (yalnızca farklı ve neredeyse her zaman hatalı olan hidden). Etkili C++ Üçüncü Baskı, Madde 36, ayrıntılı olarak bununla ilgilidir. Yani bu tam olarak değil
class B {
public:
virtual void vf();
void mf();
virtual void mf(int);
...
};
class D: public B {
public:
virtual void vf(); // overrides B::vf
void mf(); // hides B::mf; see Item33
...
};
D x; // x is an object of type D
B *pB = &x; // get pointer to x
D *pD = &x; // get pointer to x
pD->vf(); // calls D::mf, as expected
pB->vf(); // calls D::mf, as expected
pD->mf(); // calls D::mf, as expected
pB->mf(); // calls B::mf - surprise!
pD->mf(1); // error - D::mf() hides B::mf(int)!
pB->mf(1); // calls B::mf(int)
düşünün nasıl final
Java davranacağını ancak sadece C++ ile bu kadar yakın alabilirsiniz. Alt sınıflamayı tamamen önlemek bir alternatif olabilir. Bunun için teknik - çalışma, ama hoş olmayan - çözüm, tüm kurucularınızı private
ilan etmektir (ve elbette sınıfınızın örneğine izin vermek istiyorsanız, statik bir fabrika yöntemi sağlayın).
Eğer yanlış anlaşılmasaydım, o zaman 'Overriding' bu durumda çok mümkün olan temel sınıfı 'kopyalamayı gizlemektir. İstediğim şey türetilmiş sınıfları her zaman temel sınıfın 'işlev kopyası'nı kullanması/çağırması zorlamaktır. – Hemant
@Hemant, eklediğim bağlantıları ve kod örneğine bakın. –
Java'yı bilmiyorum, ama ne düşündüğümden Java'da düşündüğümden, “D :: mf()” yi bile ilan edemediniz. – sbi
Bjarnele dan Kontrol this (İnsanların benim sınıftan türetmek durdurabilir miyim?) MSVC kullanıyorsanız
Aslında mümkündür. sealed
anahtar kelimesi var. İşte bir example from msdn.
C++ 11 bunu desteklemek için bir final
bağlamsal anahtar kelime ekler:
class B
{
public:
virtual void foo() final;
};
class D : B
{
public:
virtual void foo(); // error: declaration of 'foo' overrides a 'final' function
};
final
GCC 4.7 ve Clang 3.0 desteklenir. Ve Sergius kendi cevabında belirttiği gibi, MSVC++, MSVC++ 2005'ten beri (sealed
yazımı ile) desteklemektedir. Dolayısıyla, bir mini makronun içine yerleştirir ve derleyicinize bağlı olarak ayarlarsanız, bununla yolunuza devam edebilirsiniz. Sadece 'un en az her sıklıkta böyle bir derleyiciyi kullanarak olduğundan emin olun, böylece hataları erken algılayacaksınız.
Yeni C++ 11 standardı artık açıkça geçersiz kılma ve üye işlevlerinin son halini destekliyor!
- 1. statik üye işlevleri devralma
- 2. C++ 'da özel bir sınıf içinde sınıf nasıl tanımlanır?
- 3. Üye işlevleri çağırılamıyor
- 4. Doxygen'de üye olmayan işlevleri bir sınıfla ilişkilendirmek nasıl?
- 5. R işlevleri için bağımsız değişken türleri nasıl tanımlanır?
- 6. sınıfında otomatik arama üye işlevleri
- 7. sınıf statik üye değişkenler
- 8. std :: statik olmayan üye işlevleri olan işlev
- 9. std :: wstring_convert dizisinin üye işlevleri güvenli midir?
- 10. C++ 'da Üye İşlevleri ile Okuma Dosyası
- 11. Sınıf dışı bir yöntem nerede tanımlanır?
- 12. Ruby - Sınıf yöntemleri nasıl yeniden tanımlanır?
- 13. CanBuildFrom ile Traversable için örtülü sınıf nasıl tanımlanır?
- 14. Nix'in "callPackage" çağırma işlevleri elips olmaksızın nasıl tanımlanır?
- 15. Başka bir "sınıf"/dosyadan çağrı işlevleri
- 16. F # tür üye sabiti nasıl tanımlanır? C# birinde
- 17. Bir alt sınıf sınıfının statik üye değişkeni
- 18. Nasıl Richfaces 4.0.0.Final
- 19. Final Powermockito, final olmayan beton sınıfında final yöntemini kullanabilir mi?
- 20. Sınıfın içinde ve dışında tanımlanmış bir şablon sınıfı için üye işlevleri arasındaki fark
- 21. UML sınıf diyagramında bulunan bir harita nasıl tanımlanır?
- 22. T özelliği ile bir sınıf özelliği nasıl tanımlanır T
- 23. başlatmak için nasıl üye
- 24. Nesne Yönelimli Javascript - Bir Sınıf İçinde Bir Sınıf Nasıl Tanımlanır? Bir C# örneğinden
- 25. üye
- 26. TextView için ColorStateList nasıl tanımlanır?
- 27. Kotlin'de bir final alanını nasıl başlatabilirim?
- 28. Üye, sınıf özel bir sınıf örneği olduğunda başka bir sınıfın genel üyesini nasıl görebilir
- 29. Üyelik için nasıl üye olunur?
- 30. SBT'de başka bir derleme kapsamı nasıl tanımlanır?
Bir röportajda sorulması gereken ilginç bir soru ... çünkü cevap hiçbir şey yapmamaktır. (Ben inanıyorum.) – Stephen
Hayır C++ 'daki özel işlevler geçersiz kılmayı önler, sadece sanal ve geçersiz kılmayı bildirir. – ratty
Soru çok net değil. Sanal işlevler hakkında konuştuğunuzu akılda tuttuğunuzu sormaktan rahatsız oldunuz, bu durumda cevap hayırdır: herhangi bir sınıftan herhangi bir sınıftan türetilen bir sanal işlevle elde edilen bir sınıf işlevi geçersiz kılabilir. Başkalarının işaret ettiği gibi, "sanal" olarak, tüm işlevler geçersiz kılınamaz. Java'yı bilmiyorum, bu yüzden ne zaman izin verdiğimi bilmiyorum .... –