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?