If you want to follow this path, you need to create functions in the renderer class that apply to both the dx9 and dx11 inherited classes. Everything dx9/dx11 specific you can add (members and functions) to the inherited classes.
Just out of curiosity, why go though this at all? Since all gpu's from 3 years old and younger (by head) support dx11. Plus windows xp isn't supported anymore (and I believe not often used among gamers). Of course if it's just for practice then it's another case.
I created an engine which I've been working on for years using dx9. But it's set up quite modular and flexible so later on I can "update" it to dx11.
To be honest, I just accepted that when I've implemented something with "difficult" math, it's fine. And if I have to do something with it a few months later I just take out my math notebook and look up my drawings and exercises.
Honestly, when do I need to know again how the P and N vertex for culling works if I've implemented it correctly