> ./a.out
terminate called after throwing an instance of 'char const*'
fish: “./a.out” terminated by signal SIGABRT (Abort)
In base c = d;, anything in derived but not in base is cropped, as stated above. Hence, in c, there is no int a; and int b;, also, the function foo stays throw "Not impl!";.
There is no need to implement foo s in base class as throw "Not impl!";. In this situation, base class is regraded as an interface, which means that interface classes cannot be instantiated. Copy or move constructors and assignment operators are meanless for a class which cannot be instantiated.
Just use pure virtual functions, say = 0, in interface classes.