Помимо проектных решений (например, циклические зависимости) ...
Единственная причина, по которой метод callSomething () A вызывает метод C call () из указателя на B, заключается в том, что метод call () виртуальный. Чтобы не вызывать метод C call (), вот несколько вариантов:
- Не делать метод call () виртуальным
- Переименование одного из методов call () B или C (предпочтительнее, чем первый вариант)
- Вызовите метод call () явно
Чтобы вызвать метод call () B явно:
void callSomething(void) {
something->B::call();
}