Сегодня я нашел следующее волнующе неоднозначной ситуации в нашей базе кода:Как узнать, какая функция будет вызвана?
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++ для определения того, какую версию функции она должна вызывать? Я хотел бы начать с «известного состояния» того, что должно было получиться, и затем выяснить, что там происходит.
Например, если у меня есть указатель на базу и вызов Get_Container, я предполагаю, что он просто вызовет базовую версию функции. Что делать, если у меня есть указатель на A? Как насчет указателя на B? А как насчет А или В в куче?
Спасибо.
Если у вас есть '= 0;' в базовом классе, как вы его написали, он не будет компилироваться. '= 0' может использоваться только с использованием виртуальных методов. – wheaties
Спасибо, я забыл виртуальный там (и возвращаемый тип, oops). – Colen