2016-04-26 4 views
3

Ich habe den folgenden Code (vereinfacht):Wie ruft man eine Methode und die Kindklasse auf, wenn das Argument vom Typ Elternklasse in C++ ist?

#include <cstdio> 

class parent 
{ 
public: 
    virtual void do_something() const 
    { 
    printf("hello I'm the parent class\n"); 
    } 
}; 

class child : public parent 
{ 
public: 
    virtual void do_something() const 
    { 
    printf("hello I'm the child class\n"); 
    } 
}; 

void handle(parent p) 
{ 
    p.do_something(); 
} 

int main() 
{ 
    child c; 
    handle(c); 
    return 0; 
} 

Dies druckt hello I'm the parent class, auch wenn ich ein Argument vom Typ child geben. Wie kann ich C++ sagen, dass es sich wie Java verhält und die Methode des untergeordneten Elements aufruft, indem es hello I'm the child class druckt?

+0

"Base" -Klasse ist der noch häufiger verwendete Begriff. –

Antwort

9

durch Bezugnahme das Argument übernehmen (oder wahrscheinlich konstante Referenz):

void handle (parent & p) 
//  note this^
{ 
    p.do_something(); 
} 

In Ihrem Fall slicing geschieht: der parent Teil der child als separates Objekt vom Typ extrahiert wird parent und geht an die Funktion.

Wenn Sie verschiedene Unterklassen in einer einzigen Sammlung ablegen möchten, verwenden Sie normalerweise intelligente Zeiger wie std::unique_ptr oder std::shared_ptr.

+0

Das Problem ist, dass ich im "großen" Code das Objekt in einen "Vektor" einfüge, aber es kann verschiedene Unterklassen im selben "Vektor" geben. Kann ich diese Referenzen im Vektor speichern? – msrd0

+1

BTW, nette knappe Antwort. Gut gemacht. –

+2

@ msrd0, nein, Sie können keine Referenzen im Vektor speichern. Sie müssten 'std :: unique_ptr' als Vektorelementtyp verwenden und Zeiger auf dynamisch zugewiesene Objekte speichern. – SergeyA