Sto tentando di aggiungere un numero di elementi derivati da sottoclassi in un vettore, iterare attraverso di essi chiamando un metodo sottoposto a override e voglio che invochi il metodo sottoposto a override ove possibile. Tuttavia, ho scoperto che sembra chiamare solo il metodo della superclasse.10 Chiamare i metodi di sottoclasse dalla superclasse in un vettore C++
Ho imparato Java e non so perché lo stia facendo in C++. Ho provato a riscrivere il codice usando un vettore di puntatori della superclasse e gettando il puntatore della sottoclasse sulla superclasse. Accedere a questo tramite i puntatori quindi funziona.
Idealmente non voglio dover inserire un elenco di puntatori nel vettore da allora devo eliminare manualmente ciascuno (credo?) Per fermare perdite di memoria poiché creerò gli oggetti con nuovi in modo che persistano oltre la chiamata al metodo per aggiungerli al vettore.
C'è un modo migliore per farlo o sono bloccato a utilizzare i puntatori e chiamare eliminare sugli oggetti creati quando la classe genitore non è necessaria? Preferibilmente il vettore sarebbe un elenco di classe X, piuttosto che una lista di puntatori di classe X
La mia struttura è:
class a { vector vec of class X,
method to create and add an instance of X into vector vec,
method to create and add an instance of Y into vector vec }
class X { talk() }
class Y : public X { talk() }
codice per dimostrare quello che idealmente voglio fare, ma mostrando la sua rotto da solo chiamando il metodo della superclasse:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
class A {
public:
virtual void talk() { printf("A\n"); }
};
class B: public A {
public:
void talk() { printf("B\n"); }
};
int main(void) {
std::vector<A> vec;
std::vector<A*> vec2;
A a;
B b;
a.talk();
b.talk();
vec.push_back(a);
vec.push_back(b);
vec2.push_back(&a);
vec2.push_back(&b);
for(int i = 0; i < vec.size(); i++) {
vec[i].talk();
vec2[i]->talk(); //bad but short for example
}
}
Sono necessari puntatori (possibilmente puntatori intelligenti, come 'std :: unique_ptr') per ottenere un comportamento polimorfico. Vedi ["slicing degli oggetti"] (http://en.wikipedia.org/wiki/Object_slicing). Funziona in Java perché lì, 'MyClass obj' dichiara effettivamente un puntatore a' MyClass'. –
'talk()' non è virtuale in 'A', quindi non esiste alcun metodo per sovrascrivere. Il compilatore andrà con quello che è il tipo statico, che è 'A'. – 0x499602D2
@ 0x499602D2 Errore nella prima versione di questo codice, risolto, aggiunto virtuale, ancora non funzionante come previsto. – Chewett