2013-04-02 15 views
5

Sto riscrivendo un'applicazione utilizzando C++ 11 puntatori intelligenti.C++ 11 puntatori intelligenti e polimorfismo

ho una classe di base:

class A {}; 

E una classe derivata:

class B : public A { 
    public: 
    int b; 
}; 

Ho un'altra classe contenente un vettore sia con oggetti A o B:

class C { 
    public: 
    vector<shared_ptr<A>> v; 
}; 

Non ho problemi a costruire oggetti C con A (classe base) ma come posso riempirlo con oggetti B (classe derivata)?

sto cercando questo:

for(int i = 0; i < 10; i++) { 
    v.push_back(make_shared<B>()); 
    v.back()->b = 1; 
}; 

e il compilatore restituisce: errore: 'Classe A' non ha alcun membro denominato 'b'

+0

Che cosa stai cercando di fare? Sembra trattarsi di A come polimorfico è un'idea sbagliata, dal momento che non ne farai uso. –

+2

Non si tratta di puntatori intelligenti, si sta utilizzando il polimorfismo in modo errato. Sostituisci membro b pubblico con funzione virtuale (probabilmente, ottieni e imposta funzioni). –

+0

Ho semplificato le classi. Nella loro forma reale il polimorfismo ha un senso. –

risposta

10

But how can I fill it with B (derived class) objects?

la caricate con (puntatori a) oggetti B. Tuttavia, il tipo statico dei puntatori fa riferimento alla classe di base A, quindi non è possibile utilizzarli direttamente per accedere a qualsiasi membro della classe derivata.

Nel vostro semplice esempio, si può semplicemente tenere in mano un puntatore a B e l'uso che:

std::shared_ptr<B> b = make_shared<B>(); 
b->b = 1; 
v.push_back(b); 

Se non si ha accesso al puntatore originale, allora si avrà bisogno di un certo tipo di polimorfismo :

  • uso static_cast<B*>(v.back().get())se si sa che tutti gli oggetti hanno tipo B
  • utilizzare una funzione virtuale o dynamic_cast (che richiede che la classe base contenga una funzione virtuale per funzionare) se gli oggetti potrebbero avere tipi diversi
3
for(int i = 0; i < 10; i++) { 
    auto bptr = make_shared<B>(); 
    v.push_back(bptr); 
    bptr->b = 1; 
}; 
+1

Grazie per la risposta. È corretto, ma la spiegazione di Mike Seymour mi ha aiutato a capire perché. –

Problemi correlati