If you're looking for speed, I would definitely vote for Cython too. As far as I know about other ways to interface C++ with Python, Cython is not that much heavy to maintain/update compared to other binding tools, regarding to the "fluidity of workflow" gain. (Cythonized code argues to be as fast as pure C, or not far from that, which also make it very interesting).
Anyway, there's several good API's for connecting python code with C++ (Boost.Python, ...), but I think that all of them will result in the need to expose methods directly in your C++ source code (You guys tell me if I'm wrong, or imprecise).
In the other hand, Cython will give you the possibility to keep your C++ API (GUI, or whatever...) strictly separated from the exposure sources (so called .pyx extensions). The final workflow would be :
C++ API => Compilation as shared object => Cython extension(s) (importing and exposing C++ features) => Compilation of the extension(s) => Using the extension (extension to be added to your python path).
The good news is that you'll have to maintain only the changing parts of your pool of .pyx files related to the evolving C++ features (among those which require to be exposed). It is kind of an investment at first, but, to my experience, once this workflow is setup, it is quite straight forward to make the whole stuff grow up in complexity.
Now concerning your need to extend classes that have virtuals and override them from Python (If I get correctly what you meant). It is doable. Once again, not so direct, but you should have a look at this thread.
The bad news : in that particular case you'll have to create some extra C++ adapters/interfaces, to enable the call of the parent method if the extended python one doesn't override the given parent's method. (Note that redefining a C++ exposed method, virtual or not, from python is a replacement of the function, but is absolutely not equivalent to an override).
Hummf, now that I am reading myself back, it looks a bit confusing. Hope this is still helpful.
I can be more specific about the workflow you'll have to deal with if you choose the Cython option, if you ask me to, but I think that the thread linked above is quite a good starting point...