2013-01-11 20 views
12

Bu soru benzer, ancak sınıf içinde gelen işlevini çağırarak hakkındadır: Can I call a base class's virtual function if I'm overriding it?C++ sınıfının dışında bir temel işlev çağırmanın bir yolu var mı?

Bu durumda, geçersiz kılınmış tanımını arayacak olan yerine function() ait Base::function() belirtmek istiyorum.

Ama sınıfın bunu dışarıda yapmanın bir yolu var mı? Benim sınıf bir kopya kurucu tanımlamıyor, bu yüzden temel sınıf olarak döküm nasıl çözemedim:

Base(derived_object).function() 

Base* olarak & derived_object döküm ve sonra ->function() aramaya burada yapmak için uygun bir şey var mı? sezme için

teşekkürler.

derived_ptr->Base::function(); 

inşaat iyi:

+1

'static_cast', emin olmadığım halde işe yarayabilir - sanal işlevlerin amacı, çalışma zamanında, nesnenin derleme zamanı türünden bağımsız olarak çözülmesidir ..' dynamic_cast' kesinlikle çalışmaz. –

+0

Niçin isterdin? İşlev türetilen sınıfın bir parçasıysa ve aynı zamanda temel sınıftaysa, temel sınıfı çağırdığınızda muhtemelen yanlış bir şeyler yapıyor olursunuz. Bunu çözmenin en iyi yolu, türetilmiş sınıf tarafından çağrılması gereken taban sınıfında ayrı bir işlev yapmak ve taban sınıfının bu functoion'un kendisini çağırmasına izin vermektir. –

+0

Lütfen aşağıdan @Omnifarious'a bakınız. Bir rapor hale getiren bir Baz nesnesi ve (baz rapordan duydukları ilave bilgilerle) bir rapor oluşturur Türetilmiş nesne var Thanks-- – user

cevap

18

derived_object.Base::function();

+0

Bu standart mı? Eğer öyleyse, bu hile yapar. – user

+1

@Oliver: Evet standart. – Mankarse

+4

@Oliver sınıfı :: function() üye fonksiyonu 'tam adı' dir. Çağırdığınız işlevin sınıfını belirtmezseniz, 'varsayılan' (sizin durumunuzda türetilmiş) olacaktır. – Eric

9

Ben sözdizimi inanıyoruz. Yine de, bunu neden sınıfınızın bir parçası olmayan bir işlevde yapmak isteyeceğinizi sorguluyorum. Özellikle function sanal bir işlev olduğunda.

kuşkulu bir fikir sebebi sen o notasyonu sınıfın kalıtım hiyerarşisine bağlı olduğunu kullanır ne olursa olsun yapıyoruz olmasıdır. Ayrıca, işlevler genellikle bir sebepten dolayı geçersiz kılınır. Ve bu sözdizimini kullanarak etrafta dolanıyorsunuz.

+1

. Bu yüzden baz raporunu Base :: generate_report ile oluşturup daha fazla bilgiyi kopyaladım. Bu, bir ziyaretçi desen (kaygıları daha iyi ayırma) kullanılarak sınıfın dışında yapılır - BaseReport bir Base ile inşa edilmiştir ve DerivedReport bir Türetilmiş ile inşa edilmiştir. Uf! – user

0

Muhtemelen bir sınıfın üyesi işlevleri işaretçileri kullanmak istiyorum deneyin. Bunlar size farklı temel sınıf fonksiyonlarını gerektiğinde işaretçiye ve değişken veya işlev parametresi olarak kullanma yeteneğine eşleştirebilme imkanı verir.

üye işlev işaretçisi için sözdizimi bunları kullanmak için uyarılar listesi bir mil cevapların çoğu (bunların nasıl kullanılacağı üzerinde çevrimiçi bol olduğu uzun olduğu

class Base 
{ 
public: 
    virtual bool Function(); 
    virtual bool OtherFunction(); 
}; 

typedef bool (Base::*)() BaseFunc; 

benziyor) "yok". Ancak, size bir temel sınıf üyesi işlevine açıkça bağlanma ve çağrı yapma yolu sunarlar.

+0

Yazım hatası sözdizimi yanlış. – aschepler

İlgili konular