Разве не будут использоваться конструкторы копирования по всей цепочке наследования?
Это будет, если вы оставите компилятор, чтобы сделать это для вас. Поскольку вы определили это сами, вам нужно поступить правильно.
D(const D & obj){cout <<"8";}
эквивалентно:
D(const D & obj) : A(), B(), C() {cout <<"8";}
Вам необходимо использовать:
D(const D & obj) : A(obj), B(obj), C(obj) {cout <<"8";}
чтобы убедиться, что конструкторы копирования базовых классов вызываются.