2016-04-14 16 views
0

Sanal işlevlerden ve vtables'lardan geçiyordum ve şüphem var. taban sınıfı türetilmiş sınıfın özel hale özel sonra tüm sıra üye olarak edidiğindeTemel sınıf özel olarak türetildiğinde derleyici eklenti vptr özel hale mi geliyor?

class base 
{ 
    public: 
    virtual void fun(){} 
}; 
class derived : private base 
{ 
    public: 
    void fun(){} 
}; 

kapsamı kuralıyla: Ben aşağıdaki gibi kod şey olduğunu varsayalım . Derleyici vptr (vtable işaretçisi) eklenir mi, türetilmiş sınıfa özel olur mu?

+4

'vptr', sahne arkası konseptidir. “Özel” hale gelmez çünkü doğrudan ona erişemez veya düzenini bilemezsiniz. Bununla birlikte, bunun anlamı, türetilmiş bir nesneyi olan kişilerin, bir “temel * b = & nesne” olarak erişemedikleri (veya ona dönüştüremediği), çünkü derleyici özel bir miras olduğundan şikayet edecektir. – inetknght

+0

C++ dilinde "vptr" diye bir şey yoktur (taslak standardı arayabilir ve kendiniz görebilirsiniz). Uygulamanız bu adla bir uygulama tekniğini kullanabilir (veya kullanamaz). Programa görünmez, bu yüzden özel olup olmadığını sormak mantıklı değildir. –

+0

@SergeyA Başka birinden alıntı yaptığım veya vtable kullanımıyla ilgili detaylardan dolayı katılmıyorsunuz? –

cevap

1

O fonksiyon ptr girişlerinin vtable, ve korur o private veya public açısından vtable bahsetmek bir derleyici detay çünkü, her zaman var olacaktır ve "public" olmak "uygunsuz" olsa.

Bu noktayı daha da genişletmek için, konuyla ilgili teknik bilgilere aşina değilim, ancak (farklı derleyicilerden oluşan C/C++ kodunun çok sayıda oluşturulmasına dayanarak) işlevin bir sanal ortamda monomorfizasyonu olduğuna inanıyorum. Herhangi bir uzmanlığa ihtiyaç duyulmasa bile (çalışma zamanında veya başka bir şekilde), yasaktır.

+3

Başka yanlış yönlendirilmiş ** en iyi uygulama **. Özel sanallar harika bir araçtır ve aracı birisinin kafası karışık olduğu için kullanmamanın sebebi en iyi ihtimalle şüphelidir. – SergeyA

+0

En iyi uygulama konusundaki anlaşmazlıklara sempati duyuyorum, fakat gerçek cevapta yanlış bir şey var mı (vtable uygulama)? –

+0

Özel sanal işlevlerin çok yanlış bölümünü kaldırın ve Tamam yanıtı olacaktır. – SergeyA

İlgili konular