virtual copy constructors



  • Ich beziehe mich hier auf Item 25 aus More Efficient C++ von Scott Meyers.

    Im Folgenden Konstrukt wird ein Beispiel vorgestellt, bei dem eine Abstrakte Klasse eine clone Funktion definiert, die in den abgeleiteten Klassen eine Kopie der aktuellen Instanz über den Copy Konstruktor zurückliefert:

    class NewsletterComponent{
    public:
        // declaration of virtual copy constructor
        virtual NewsletterComponent * clone() const = 0;
    };
    
    class TextBlock: public NewsletterComponent {
    public:
        virtual TextBlock * clone() const
        {   return new TextBlock(*this); }
    };
    
    class Graphic: public NewsletterComponent {
    public:
        virtual Graphic * clone() const
        {   return new Graphic(*this); }
    };
    

    das die clone Funktionen andere Rückgabetypen haben können ist verwirrend, aber scheint C++ nichts auszumachen.

    Was mich aber irritiert ist der folgende Code, da wird über eine Liste von 'NewsletterComponent' die 'TextBlock' und 'Graphic' Instanzen kopiert:

    class Newsletter {
    public: 
        Newsletter (const Newsletter & ths);
    private:
        list<NewsletterComponent*> components:
    };
    
    Newsletter::Newsletter (const Newsletter & ths)
    {
        for(list<NewsletterComponent*>::const_iterator it = rhs.components.begin(); 
            it != rhs.components.end(); ++it) 
        {
            components.push_back((*it)->clone());
        }
    }
    

    Hier tauchen ein paar Verständnisfragen auf:

    1. Warum kann ich Pointer auf NewsletterComponent als Typ angeben aber stattdessen ebenfalls davon abgeleitet Klassen speichern.

    2. Woher weiß die clone() Funktion von NewsletterComponent auf welche abgeleitete KLasse sie sich bezieht? Oder geht das nur weil eigentlich immer ein Pointer auf TextBlock oder Graphic gespeichert wurde?



  • 1. Das nennt sich Kovarianz:
    http://de.wikipedia.org/wiki/Kovarianz_(Informatik)

    2. Das wird zur Laufzeit ermittelt, weil die Methoden virtuell sind.
    http://de.wikipedia.org/wiki/Polymorphie_(Programmierung)

    Simon


Anmelden zum Antworten