2016-05-02 7 views
1

Lets sagen, dass ich diesen Code haben:Karte von Vektoren einer abgeleiteten Klasse unter Verwendung der Funktion der seiner Klasse zu nennen

class Parent{ 
public: 
    virtual void printm(){ 
    cout << "Parent" << endl; 
} 

class Child:public Parent{ 
public: 
    void printm(){ 
    cout << "Child" << endl; 
} 

int main() 
{ 
Parent * aPerson = new Child; 

map<string, vector<Parent*>> family; 

family["Test"].pushback(aPerson); 

//I want to be able to do SOMETHING like this but I'm wondering if that's 
//possible? I know it looks crazy but please bear with me 

printdata(family["Test"]); 
} 

void printdata(Parent * x){ 
x->printm(); 
} 

ich überall gesucht haben und nicht in der Lage, jemanden zu finden, der eine ähnlich Problem für mich. Ich habe das Gefühl, dass es möglich ist. Ich weiß, es ist viel einfacher zu tun:

printdata(aPerson); 

Aber ... wieder ... Ich möchte nur alle Möglichkeiten kennen.

+2

'family [" Test "]' ist kein Elternteil * oder ein Kind * - es ist ein Vektor von Eltern * s. Es könnte mehrere Zeiger enthalten oder keine - in welchem ​​Fall, was möchten Sie tun? – immibis

+0

Ich bin wirklich langsam .. Wenn Sie fragen, was ich wirklich tun möchte: Ich möchte einfach die Funktion Printm() mit der Map-Taste aufrufen. Aber wie die Dinge jetzt aussehen, muss ich vielleicht einige Funktionsparameter ändern? – Xirol

+1

Sie verstehen nicht: die Karte enthält keine Zeiger auf Elternklassen. Die Karte enthält einen Vektor von Zeigern zu übergeordneten Klassen. So haben Sie die Karte deklariert. Sie müssen entscheiden, was zu tun ist, wenn: 1) der Vektor leer ist, 2) der Vektor einen Zeiger enthält und 3) der Vektor mehr als einen Zeiger enthält. –

Antwort

4

family["Test"] wertet zu std::vector<Parent*>. Sie können eine Funktion Überlastung hinzufügen:

void printdata(std::vector<Parent*> const& x) 
{ 
    for(auto item : x) 
    { 
     printdata(item); 
    } 
} 

Dann

printdata(family["Test"]); 

funktionieren sollte.

Verwandte Themen