// check it out on Compiler Explorer : https://godbolt.org/ struct Delay { virtual void wait() = 0; }; struct FreeRTOS_Delay : Delay { void wait() override { _wait(); } private: static void _wait() { for(volatile int i = 0; i < 10; i++); } }; struct STM_Hal_Delay : Delay { void wait() override { _wait(); } private: static void _wait() { // systick stuff here for(volatile int i = 0; i < 1000; i++); } }; int main() { FreeRTOS_Delay dly; dly.wait(); return 0; }