Warum ändert die Verwendung einer virtuellen Basisklasse das Verhalten des Kopierkonstruktors

Im folgenden Programm dasa Mitgliedsvariable wird nicht kopiert, wenn B virtuell von A abgeleitet wird und Instanzen von C (nicht B) kopiert werden.

#include <stdio.h>

class A {
public:
    A() { a = 0; printf("A()\n"); }

    int a;
};

class B : virtual public A {
};

class C : public B {
public:
    C() {}
    C(const C &from) : B(from) {}
};

template<typename T>
void
test() {
    T t1;
    t1.a = 3;
    printf("pre-copy\n");
    T t2(t1);
    printf("post-copy\n");
    printf("t1.a=%d\n", t1.a);
    printf("t2.a=%d\n", t2.a);
}

int
main() {
    printf("B:\n");
    test<B>();

    printf("\n");

    printf("C:\n");
    test<C>();
}

Ausgabe

B:
A()
pre-copy
post-copy
t1.a=3
t2.a=3

C:
A()
pre-copy
A()
post-copy
t1.a=3
t2.a=0

Beachten Sie, dass, wenn B normalerweise von A abgeleitet ist (Sie löschen dasvirtual) danna wird kopiert.

Warum ist nichta im ersten Fall kopiert test<C>() mit B virtuell von A abgeleitet?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage