Warum ruft der implizite Kopierkonstruktor den Kopierkonstruktor der Basisklasse auf und der definierte Kopierkonstruktor nicht?

Betrachten Sie eine Klassen-Hierarchie, wo A ist die Basisklasse und die B stammt aus A.

Wenn die Kopie-Konstruktor definiert ist, nicht in Bder compiler synthetisieren. Wenn Sie aufgerufen wird, diese Kopie-Konstruktor rufen die Basisklasse copy-Konstruktor (selbst synthetisiert, wenn keine durch den Benutzer).

#include <iostream>

class A {
    int a;
public:
    A() {
        std::cout << "A::Default constructor" << std::endl;
    }

    A(const A& rhs) {
        std::cout << "A::Copy constructor" << std::endl;
    }
};

class B : public A {
    int b;
public:
    B() {
        std::cout << "B::Default constructor" << std::endl;
    }
};

int main(int argc, const char *argv[])
{
    std::cout << "Creating B" << std::endl;
    B b1;
    std::cout << "Creating B by copy" << std::endl;
    B b2(b1);
    return 0;
}

Ausgabe:

Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor

Wenn der Benutzer definiert seine eigenen copy-Konstruktor in Bwenn Sie aufgerufen wird, diese Kopie-Konstruktor rufen die Basisklasse Standard-Konstruktores sei denn, ein Aufruf der Basisklasse kopierkonstruktor ist explizit vorhanden (z.B. in der Initialisierungs-Liste).

#include <iostream>

class A {
    int a;
public:
    A() {
        std::cout << "A::Default constructor" << std::endl;
    }

    A(const A& rhs) {
        std::cout << "A::Copy constructor" << std::endl;
    }
};

class B : public A {
    int b;
public:
    B() {
        std::cout << "B::Default constructor" << std::endl;
    }
    B(const B& rhs) {
        std::cout << "B::Copy constructor" << std::endl;
    }
};

int main(int argc, const char *argv[])
{
    std::cout << "Creating B" << std::endl;
    B b1;
    std::cout << "Creating B by copy" << std::endl;
    B b2(b1);
    return 0;
}

Ausgabe:

Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor

Meine Frage ist, warum werden nicht die Benutzer-definierten copy-Konstruktor-Aufruf der Basisklasse copy-Konstruktor wird als default-Verhalten?

InformationsquelleAutor der Frage Vincenzo Pii | 2012-02-07

Schreibe einen Kommentar