2016-04-12 30 views
-1

A'dan türeyen herhangi bir sayıda sınıfın örneklerini içerebilen A türünde nesnelerin bir listesini kullanıyorum. Listenin her üyesi için bir işlev çağırıyorum ve En türetilmiş sınıftan işlev çağrılabilir. Bununla birlikte, temel sınıfın işlevi çağrılır. En çok türetilen sınıfın kullanıldığı duruma nasıl ulaşabilirim?Çoğu türetilmiş sınıftan sanal işlev çağırma

Aşağıdaki kod benim sorunumu gösterir. Kod "In a" çıktılar ancak "In b" çıkışını istiyorum. Eğer

A a = B(); 

yaptığınızda

#include <iostream> 

class A { 
public: 
    virtual void func() 
    { 
     std::cout << "In A" << std::endl; 
    } 
}; 

class B : public A { 
public: 
    virtual void func() 
    { 
     std::cout << "In B" << std::endl; 
    } 
}; 

int main() 
{ 
    A a = B(); 
    a.func(); 
    return 0; 
} 

cevap

6

sen slicing the object bulunmaktadır. Sahip olduğunuz sadece bir A nesnesinin örneğidir.

B b; 
A& a = b; 

veya kullanım işaretçileri

A* a = new B; 
+0

Teşekkür Joachim, sorunumu – JHobern

+0

çözüldü Veya akıllı işaretçileri kullanın:

Eğer başvuruları kullanmak için her ihtiyaç polimorfizmi çalışmasını sağlamak için! std :: unique_ptr ve std :: shared_ptr – Ceros

+0

@Ceros Bunlar genel olarak işaretçilerin bir çeşidi. Ayrıca, yeni akıllı işaretçilerle basit bir otomatik silme işaretçisi kullanmayı, ancak * sahiplik * modelinin bir parçası olarak önermem. –

İlgili konular