2012-08-29 23 views
8

bir üst sınıf işlevi çağırmak için nasıl vardır:C++: dışarıda

class A{ 
    public: 
     virtual void foo(); 
}; 

class B : public A{ 
    public: 
     void foo(); 
}; 

B *ptr = new B(); 

Ben DOĞRUDAN 'ptr' işaretçi kullanan bir en foo() aramak istiyorum. Ben

(A*)ptr->foo(); 

çalıştığınızda

hala foo() ait B'nin versiyonunu çağırır. Bunun yerine A sürümünü nasıl arayabilirim?

Bu mümkün mü? Alternatifler nelerdir? Teşekkür ederim.

+0

http://en.wikipedia.org/wiki/Scope_resolution_operator – Pramod

+0

'a bir bakın "Çalışmıyor" ile ne demek istediğini açıklayabilir misiniz? Yukarıdaki kodu denediğinizde tam olarak ne olur? –

+3

Bunu yapmak, bir işlevi sanallaştırma amacını tamamen ortadan kaldırır, yani sınıf A'nın kullanıcısının sınıf tasarımcısının amacından kaçtığı anlamına gelir. Bu muhtemelen bir yerde bir tasarım hatası olduğu anlamına gelir: ya "A" gerekli tüm işlevselliği sağlamıyor ya da "A" kullanıcısı ne yapması gerektiğini anlamıyor. –

cevap

18

:: kapsam-özünürlük formuna sahip bir işlevi adlandırdığınızda, sanal değil sanki adlandırılmış işlevi çağırırsınız.

+3

+1. Bu doğru, OP'nin kodundaki erişilebilirlik konusunu da konuşursanız daha iyi olur. – Nawaz

+3

@Nawaz: Ve hatta eğer tüm OO ilkelerini bozduğu gerçeği de belirtildiyse daha da iyisi :) 'B' kullanıcısı 'foo' nun hangi versiyonunun arandığını ummamalı, yani polimorfizmin ana noktası. –

2

İşlevlerinizi genelleştirmeniz gerekir. Sadece aşağıdaki değişikliği yaparak bunu: Bunu olmadığında

class A{ 
    public: 
     virtual void foo(); 
}; 

class B : public A{ 
    public: 
     void foo(); 
}; 

, fonksiyonlar "dışarıda" den otomatik olarak özel ve erişilemez.

+0

Genelde bunlar örnekte belirtmemiştim. – nahpr

+4

@nahpr İleride başvurmak için, burada gönderdiğiniz kodda ek hatalar getirmemek için özenli bir çaba göstermenizi öneririz. Bu, yardımcı olmayan cevaplarla zaman ayırmanızı engellemeye yardımcı olacaktır. –

İlgili konular