2010-04-06 19 views
6

C++, vtable kullanmayan bir arabirimin düzgün bir şekilde uygulanmasını sağlıyor mu? örneğinC++, vtable kullanmayan bir arayüzün statik bir polimorfizm uygulamasına sahip midir?

class BaseInterface{ 
public: 
virtual void func() const = 0; 
} 

class BaseInterfaceImpl:public BaseInterface{ 
public: 
void func(){ std::cout<<"called."<<endl; } 
} 

BaseInterface* obj = new BaseInterfaceImpl(); 
obj->func(); 

son satırında fonksiyon çağrısı BaseInterfaceImpl :: değer işlev fonk ptr bulmak için VTABLE gider, fakat BaseInterfaceImpl değil doğrudan bunun için herhangi bir C++ yolu yoktur Saf arabirim sınıfı BaseInterface dışında herhangi bir sınıftan alt sınıf mı?

Teşekkürler. Gil.

+0

Bu vtable içinden geçtiği için neden umurunda olursunuz? – Thomas

+0

coz Hızın önemli olduğu bir proje üzerinde çalışıyorum. Ayrıca, vtable tam oo polimorfizmi için büyük bir çözüm olduğunu ama 'arayüz' uygulamak için bir overkill olduğunu düşünüyorum ve umarım daha hafif bir çözüm var olur umarım .. – gilbertc

+0

@gilbertc: Burada bir yanlış anlama olduğunu düşünüyorum. * Arayüz kavramının herhangi bir "uygun" uygulaması vtable gibi bir şeyden geçecektir. Aksi halde, dinamik polimorfizm imkansız olurdu. – Thomas

cevap

7

Evet. Bu moniker CRTP tarafından gider. Bir gezginin olsun.

+0

Özellikle "Statik polimorfizm" başlığı: http://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism Belki bunu düzenleyebilirsiniz cevabınıza örnek – Thomas

+0

@Thomas: teşekkürler. ed. – gilbertc

+0

Sorun değil. Oldukça meraklıyım, kodunuz vtable bir görünümün küçük yükünün bile performansa zarar verdiği yerde optimize edilmiş mi? Hangi uygulama? Normalde bir uzay koruyucu olarak veya RAII endişesinin uygulanmasında kullanılır. – wheaties

0

Sanırım herhangi bir dilde, derleme zamanında hangi fonksiyonun çağrılması gerektiğini bilmedikçe, dinamik gönderim yapmak için bir veterinerin eşdeğerine denk gelmesi gerekecek. Bu, akıllı bir derleyici optimizasyonunun veya CRTP (daha önce bahsedilen buğdaylar) gibi bir tekniğin sonucu olabilir.

+0

ve bu arada, vtable üzerinden geçmenin, böyle bir çağrıyı "uygunsuz" hale getirdiğini anlayamıyorum. – rmeador

+0

@thomas, rmeador: kelimeyi uygun bir şekilde kullanmamaya karar verdim. Arayüzün 'daha verimli' ve 'hafif' uygulanması yönünde olmalıdır. – gilbertc