В следующей программе переменная-член a
не копируется, когда B фактически получен из A и копируются экземпляры C (не B).
#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>();
}
выход:
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
Обратите внимание, что если B обычно получается из A (вы удаляете virtual
), то a
копируется.
Почему в первом случае не копируется a
(test<C>()
с B, фактически полученным из A?