I must admit that the desired output still leaves me puzzled, but you can reach a solution without using aliases, inheritance or possibly even multiple inheritance. Simply pass a D object as an optional parameter to C's doit() method. My solution below uses Moose, i cannot stress how incredibly useful Moose is, especially if you are considering using multiple inheritance (look into roles). Hope this helps. :)

If you have a good unit test suite then you should be able to make such a change and find what the change broke elsewhere and correct the problem. I would prefer to correct incorrect code rather than add more incorrect code to fix a symptom.