This would require you control the creation of the instances though, instances will need to be of type c1d, c2d, c3d, won't work if you get objects of type c1, c2 or c3

You can do explicit type conversions as @David pointed out (which is a clever trick), but that means you'll have two instances of your object. For a very simple case like the one presented in the question, it might do... if you need anything more advanced, that might be quite tricky