class subscriber
{
public:
virtual void update() = 0;
}
class entity : public subsriber
{
public:
virtual void update() = 0;
}
class myObject : public entity
{
public:
virtual void update()
{
do_things();
}
}
subscriber * ptr = new myObject; //will use shared_ptr, but here i want simplicity
ptr->update();
Вопрос в том, будет ли вызвана правильная функция обновления (реализованная в myObject)? И допустимо ли иметь две чистые виртуальные функции с одинаковыми именами в одной «семье»?
будет вызвана правильная функция обновления (реализованная в myObject)?
Да, это будет называться.
допустимо ли иметь две чистые виртуальные функции с одинаковыми именами в одной «семье»?
Вторая декларация (т.е. внутри entity
класс) не вводит в семью вторую чисто виртуальную функцию: подписи идентичны, поэтому update()
это одна виртуальная функция. Более того, объявлять его во второй раз не обязательно: entity
будет оставаться абстрактным, и будет иметь доступ к update()
метод, даже если вы удалили второе объявление.
Виртуальная функция или виртуальный метод — это функция или метод, поведение которых может быть переопределено в классе наследования функцией с той же сигнатурой.
Так что ответ да.