До тех пор, пока 'super' не будет реализован в c ++, я ищу способ эмулировать его сам. Мотивация: Вот типичный сценарий:
class A
{
void SomeMethod();
}
class B : public A
{
void SomeMethod() override;
}
void B::DoSomething()
{
A::SomeMethod();
}
Все хорошо, пока кто-то не вставит класс между:
class C : public A
{
void SomeMethod() override;
}
и не изменит наследование:
class B : public C {...}
В большинстве случаев я бы хотел, чтобы вызывался непосредственный базовый класс, что произойдет только в том случае, если я явно заменю все вызовы A :: на вызовы C ::.
Ключевое слово 'super' будетЗдесь лучше использовать, где это означает: «использовать непосредственную базу, но выдать ошибку компилятора, если она неоднозначна».
Читая некоторые предложения, я попытался определить следующее:
class A
{
void SomeMethod();
protected:
using super = A;
}
class C
{
void SomeMethod();
protected:
using super = C;
}
void B::DoSomething()
{
super::SomeMethod();
}
ОднакоA :: SomeMethod () был вызван вместо C :: SomeMethod () ...
Как компилятор обрабатывает несколько псевдонимов с одинаковыми именами?
Как это исправить?
РЕДАКТИРОВАТЬ : предложенный другой вопрос - старый, где решения могут быть улучшены с использованием современного c ++.