2011-07-05 29 views
7

Sınıflarımın çoğunu iki işlevle serial() ve write(). Benim yapmak istediğim, alt sınıflardan adlandırılan temel sınıfın read/write() işlevine sahip olmaktı, böylece seri hale getirme kodunu birçok kez tekrarlamak zorunda kalmam. ÖrneğinC++ 'da geçersiz kılındıktan sonra orijinal işlevi nasıl çağırılır?

:

class Base 
{ 
public: 
    base(); 
    virtual read(QDataStream&); 
    virtual write(QDataStream&); 
private: 
    int a, b, c, d; 
} 

class Sub : public Base 
{ 
public: 
    Sub(); 
    read(QDataStream&); 
    write(QDataStream&); 
private: 
    int e, f, g, h; 
} 

Yani bu örnekte, i Üssü'nden gelmek için a, b, c, d yazma/okuma kodunu istiyorum. Alt sonra Base :: read (QDataStream &) ve sonra Sub için herhangi bir öznitelikler niteliklerini ekleyin. Bu şekilde, her alt sınıfın serileştirme kodunu tekrarlamak zorunda kalmam (ve muhtemelen bunu yapmayı unutmayın).

+6

Not. "Aşırı yükleme", aynı ada sahip, ancak farklı argüman türlerini kullanan birkaç yönteme sahip olduğunuz zamandır. Örneğin, bir dize sınıfı, stringler söz konusu olduğunda + operatörü vermek için operatör +() işlevini aşırı yükleyebilir. – Caleb

+0

Örnekleri doğru yapmaya çalışmalısınız. Üye fonksiyonları geri dönüş türlerini, türü "Base" olarak adlandırılır, ama bir 'base' kurucusu var gibi görünüyor ... –

+0

Caleb açıklama için teşekkürler. – jecjackal

cevap

17

Temel sınıfı tanımlayıcıyla işlev çağrısını ve ardından kapsam operatörünü (: :) kullanarak, temel sınıf işlevlerini çağırabilirsiniz. Bunun gibi

:

class Base 
{ 
public: 
    virtual void Function(); 
} 

class Foo : public Base 
{ 
public: 
    void Function(); 
    void DoSomething(); 
} 

void Foo::DoSomething() 
{ 
    Base::Function(); // Will call the base class' version of Function(). 
    Function();   // Will call Foo's version of Function(). 
} 

DÜZENLEME: istek üzerine kaldırıldı Not.

+5

Lütfen, tüm * eklenen notu kaldırın *, tamamen konu dışı ve daha kötüsü: yanlış. Başlatıcı listesi ve kalifiye üye işlev çağrıları tamamen ilgisizdir. Aynı sözdizimine bile sahip değiller, ortak olan tek şey, taban türünün adının kodda bir yerlerde göründüğü. –

+0

Ayrıntılı açıklama için teşekkürler – jecjackal

+0

@David: Nottaki kodun derleyeceğini ve açıkladığım şeyi yapacağını belirtmek isterim. Ancak ben onu kaldırdım, çünkü ben (o cevapta belirtildiği gibi) offtopic olduğunu kabul ediyorum. Tam olarak cevaplandırılan ve ek bilginin başladığı noktadaki noktadan açıkça bahsetmiş olsaydım (tam olarak olmasa da) ilgili ek bilgi sağlamaya yönelik herhangi bir zararı olmadığı varsayımı altındaydım (durumdaki gibi). . – Rycul

9
void Sub::read(QDataStream &stream) 
{ 
    Base::read(stream); 
    // do Sub stuff here 
} 
6

İlk kapalı - üye işlevleriniz dönüş türü içermiyor - C++ 'da geçerli değil, derleyiciniz' varsayılan int 'davranışından şikayetçi olabilir ve izin verin, ancak onlara geri dönüş türlerini vermelisiniz (void kullanıyorum yer tutucu olarak.

Sen kapsam kararlılığını can ve bir alt sınıfta olunca üst sınıf sürümünü kullanın: Bu aslında bir yöntem "ağır basan" denir

void Sub::read(QDataStream& qds) { 
    Base::read(qds); 

    // do more stuff 
} 
+0

Bu harika çalışıyor, teşekkürler – jecjackal

İlgili konular