I don't think there's any reason to make them pure virutal:

* You can use cef_window by itself to subclass any HWND and get all of the conveniences of a class wrapper for a window handle (just like using CWnd)
* You can use cef_dark_window to subclass any HWND and get a dark window plus the class wrapper 

cef_host_window is already pure virtual since it needs the GetBrowser() method to be implemented in order to be instantiated.

Originally there was only cef_window and cef_main_window but I had to do a fair amount of refactoring (which is why there are now 5 window classes) so that code could be shared to make popup windows dark.