40 Stimmen

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

Betrachten Sie eine Klassenhierarchie, in der A ist die Basisklasse und B leitet sich ab von A .

Wenn der Kopierkonstruktor nicht in B wird der Compiler eine synthetisieren. Wenn dieser Kopierkonstruktor aufgerufen wird, ruft er den Kopierkonstruktor der Basisklasse (auch die synthetisierte, wenn der Benutzer keine angegeben hat).

#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 seinen eigenen Kopierkonstruktor in B aufruft, ruft dieser Kopierkonstruktor bei seinem Aufruf der Standardkonstruktor der Basisklasse Es sei denn, ein Aufruf des Kopierkonstruktors der Basisklasse ist ausdrücklich vorhanden (z. B. in der Initialisierungsliste).

#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 ruft der benutzerdefinierte Kopierkonstruktor nicht den Kopierkonstruktor der Basisklasse als Standardverhalten auf?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X