2016-03-20 13 views
1

Ich versuche Polymorphie zu verwenden, um die abgeleitete "add" -Methode von der Basisklasseninstanz aufzurufen.Aufruf der abgeleiteten Klassenmethode von der Basisklasseninstanz

Aber es möchte noch Basisklasse RealThing "add" Methode ausführen.

Ich erwartete abgeleitete Klasse RealThingNextVersion "add" Methode.

#include <iostream> 
#include <string> 
using namespace std; 

class VirtualObject 
{ 
public: 
    virtual void load() { 
     cout << "Nothing to load." << endl; 
    } 

    void import(string file) { 
     //here some importing stuff 
    } 
}; 

class RealThing :public VirtualObject 
{ 
private: 
    string file; 

protected: 
    int id; 

public: 
    RealThing(string fileName = "data.txt") { file = fileName; } 

    void load() { 
     this->import(this->file); 
     cout << "Thing data loaded." << endl; 
    } 

    virtual void add(int id) { 
     cout << "Added V1: " << id << endl; 
    }; 
}; 

class RealThingNextVersion : public RealThing 
{ 
public: 
    string desc; 

public: 
    virtual void add(int id, string desc) { 
     cout << "Added V2: " << id << " with description " << desc << endl; 
    }; 
}; 


int main() { 
    RealThing rt; 
    RealThingNextVersion rtv; 

    RealThing* r; 
    r = &rt; 
    r->load(); // OK., returns: Thing data loaded. 
    r->add(11); // OK., returns: Added V1: ... 

    r = &rtv; 
    r->add(22, "info"); // Here "Error: too many arguments in function call" 
    // it still want's to run RealThing "add", 
    // and I was expecting RealThingNextVersion "add" 


    system("pause"); 
} 

Antwort

2

Die add in RealThingNextVersion hat einen anderen Anruf Signatur (verschiedene Parameter) von der einen in RealThing, so dass es eine andere Funktion, und nicht eine Überschreibung von add ist. Wenn Sie das override Keyword in Ihrer Funktionsdeklaration hinzufügen

virtual void add(int id, string desc) override; 

mit einem aktuellen Compiler der Compiler wird Ihnen sagen, dass Sie überschreiben nichts.

+0

Also, wie in 'RealThingNextVersion' Klasse zu erstellen, Version von' add' Methode, aber mit 2 Parametern, die von der Basisklasse durch Polymorphismus aufgerufen werden können? – BlueMark

+1

@BlueMark Sie benötigen einen 2-Parameter 'add' in der Basisklasse. – 1201ProgramAlarm

Verwandte Themen