Это потому, что:
Это:
B(const A &a)
{
printf("B::B(A &a)\n");
}
не является конструктором копирования!
Однако это:
B(const B &a)
{
printf("B::B(A &a)\n");
}
конструктор копирования.
С вашей версией конструктора копирования вы также разрушаете стек.
Чтобы доказать свою точку зрения на повреждение стека, вы должны попробовать это:
Обратите внимание, что он никогда не будет печатать "Inside B :: Print ()"
class A
{
public:
A() { printf("A::A()\n"); }
A(const A &a)
{
printf("A::A(A &a)\n");
}
A &operator=(const A &a) { printf("A::operator=\n"); }
void print(){printf("Inside A::Print()\n"); }
};
class B : public A
{
public:
B() { printf("B:B()\n"); }
B(const A &a)
{
printf("B::B(A &a)\n");
}
B &operator=(const B &b) { printf("B::operator=\n"); }
void print(){printf("Inside B::Print()\n");}
};
int main(int argc, char *argv[])
{
printf(">> B b1\n");
B b1;
b1.print();
printf(">> b2 = b1\n");
B b2 = b1;
b2.print();
return 0;
}