2009-01-25 20 views
7

Temel sınıfımda korumalı işlevi çağırmıyorum. Niye ya? Bu şuna benzer: 'adı :: sınıf :: f2': Ben error C2248 olsun msvc olarak temel sınıf korumalı işlevleri arayabilir mi?

class B : B2 
{ 
public: 
    virtual f1(B*)=0; 
protected: 
    virtual f2(B*) { codehere(); } 
} 
class D : public B 
{ 
public: 
    virtual f1(B*b) { return f2(b); } 
protected: 
    virtual f2(B*b) { return b->f2(this); } 
} 

sınıfın 'adı :: sınıf'

yılında beyan korumalı üyesi erişemez gcc Hata alıyorum: 'sanal int adı :: class :: f2()' korunuyor.

Neden? Korunan üyelerin, aramanın türetilmiş sınıflar için olduğunu düşündüm.

+0

En azından, düzeltmemizi istediğiniz hataları derleyip oluşturacak kod ekleyin. Yukarıdaki kodda, sorununuzu çözmenin çok fazla başka sözdizimi hataları vardır. –

+0

i martin ile aynı fikirdeyim. size yardım etmemizi isterseniz, kodunuzu C++ yapma konusunda biraz zaman ayırın (iade türleri, noktalı virgüller ve diğer şeyleri ihmal etmeyin) –

cevap

15

Korumalı üye işlevleri yalnızca temel sınıfın içinde veya türetilmiş sınıfında çağrılabilir. Onları sınıfınızın dışında arayamazsınız. Dış arama, sınıf tipli bir değişkenin üye işlevini çağırmak anlamına gelir. f2 sınıfının kendisi üzerinde çalışır, çünkü

Yani

virtual f1(B*b) { return f2(b); } 

, tamam. f2 b olmayan sınıf D'nin, kendisi üzerinde çalışır, çünkü, derlenmeyecektir

Ancak

virtual f2(B*b) { return b->f2(this); } 

(iç olarak adlandırılır). (dışarıdan çağrılır) Bu yasadışı.

Düzeltmek için B :: f2 herkese açık olmalıdır.

+0

Soru, bunun etrafında herhangi bir yol var mı, yönetilen dünyadan geliyorum, buna izin verilir ve ben Bunu çok yararlı buluyorum, gerçekten sadece bu özel şeyleri içselleştirmek istemiyorum, ancak etrafta başka bir yol yoksa, sanırım yapmam gerek. Sınıfı kendisinin bir arkadaşı yapmak mümkün mü? –

+0

John ya f2'yü herkese açık yap ya da D'nin bir arkadaşı olduğunu ilan et. Başka bir yolun farkında değilim. – OldPeculier

İlgili konular