The copy constructor implicitly defined by the compiler performs a memberwise copy/move of its bases and members.
A user-defined copy-constructor defaault initializes subobjects of the derived class if their constructors were not called explicitly in the ctor-list.
So in your last code snippet you defined explicitly the copy constructor
Composite(const Composite&) {
cout << "in composite's copy constructor" << endl;
}
but its ctor list is empty. So data member withcc will be default initialized.
I described this more detailed in my article
Implicitly defined copy constructor and explicitly defined copy constructor: what is the difference?
Though it is written in Russian but you will be able to read it using for example google service translare.