Сегодня я обнаружил следующую тревожно-неоднозначную ситуацию в нашей базе кода:
class Base {
public:
virtual void Irrelevant_Function(void) = 0;
protected:
C_Container * Get_Container(void);
};
class A : public Base, public Not_Important {
public:
inline C_Container * Get_Container(void);
};
class B : public Base, protected SomethingElse {
public:
C_Container * Get_Container(void);
};
Многие вещи вызывали метод Get_Container, но не всегда вызывали правильный - обратите внимание, что ни одна из этих функций не была виртуальной.
Мне нужно переименовать методы Get_Base_Container
, Get_A_Container
и т. Д., Чтобы устранить неоднозначность.Какие правила использует C ++, чтобы определить, какую версию функции он должен вызывать?Я хотел бы начать с «известного состояния» того, что должно было быть вызвано, а затем выяснить ошибки оттуда.
Например, если у меня есть указатель на Base и вызову Get_Container,Я предполагаю, что это просто вызовет базовую версию функции.Что если у меня есть указатель на A?Как насчет указателя на B?А как насчет A или B в куче?
Спасибо.