Так и есть. Хотя у меня например сильно проще. Никакого наследования. Драйвер на конкретную железяку имеет свою функцию отжать буфер. У SPI, UART, I2C своя реализация работы в железе, но функции общие: u8 CSPI::getBuffer(u8 *buf) {
....
}
u8 CUSART::getBuffer(u8 *buf) {
....
}
u8 I2C::getBuffer(u8 *buf) {
....
}
как-то так...