Abstracts where possible in C++ implementation