Multi-Level Vererbung



  • Hi miteinander

    Folgende Klassenhierarchie:

    class ApplicationHelper: public Object {
    public:
    	// ...
    	virtual Ptr<Application> Install(const Ptr<Node> &) const;
    	Ptr<Application> Install(const std::string &) const;
    	ApplicationContainer Install(const NodeContainer &) const;
    	// ...
    };
    
    class TrafficGeneratorHelper: public ApplicationHelper {
    	// ...
    };
    
    class VoipTrafficGeneratorHelper: public TrafficGeneratorHelper {
    public:
    	// ...
    	virtual Ptr<Application> Install(const Ptr<Node> &) const;
    	// ...
    };
    

    Möchte ich nun Install auf einen NodeContainer ausführen mit einem VoipTrafficGeneratorHelper, etwa so:

    VoipTrafficGeneratorHelper voipHelper;
    NodeContainer container;
    voipHelper.Install(container);
    

    So erhalte ich folgende Fehlermeldung:

    ../src/tragic-test.cc: In static member function `static void TragicTest::test3GroupsCsmaNetwork()':
    ../src/tragic-test.cc:44: error: no matching function for call to `ns3::VoipTrafficGeneratorHelper::Install(ns3::NodeContainer&)'
    c:/Program Files/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/tragic/traffic-generator/voip-traffic-generator-helper.h:18: note: candidates are: virtual ns3::Ptr<ns3::Application> ns3::VoipTrafficGeneratorHelper::Install(const ns3::Ptr<ns3::Node>&) const
    mingw32-make: *** [src/tragic-test.o] Error 1
    

    Caste ich das Ding vorher zu einem ApplicationHelper, also:

    VoipTrafficGeneratorHelper voipHelper;
    NodeContainer container;
    static_cast<ApplicationHelper *> (&voipHelper)->Install(container);
    

    Funktioniert es wiederum problemlos. Was also, frage ich mich, muss ich tun um die geerbte Methode einfach so aufrufen zu können?

    TrafficGeneratorHelper helper;
    NodeContainer container;
    helper.Install(container);
    

    Klappt übrigens ebenfalls problemlos.

    Besten Dank schon im Voraus und freundliche Grüsse
    Kessi



  • Mit der Deklaration in der abgeleiteten Klasse verdeckst du die gleichnamigen Funktionen in Basisklassen. Mittels using innerhalb der Klassendefinition kannst du diese explizit wieder sichtbar machen:

    using ApplicationHelper::Install;
    


  • Funktioniert perfekt 🙂 .

    Danke für die rasche Antwort und gute n8 😃


Anmelden zum Antworten