Переопределение шаблонной функции класса - PullRequest
2 голосов
/ 15 августа 2010

Я пытаюсь создать какой-то обратный вызов для шаблона класса.Код выглядит так:

template <typename t>
class Foo {
    void add(T *t) {
        prinf('do some template stuff');
        on_added(t);
    }
    void on_added(T *t) { }
}

struct aaa {}

class Bar : Foo<aaa> {
    void on_added(aaa *object) {
        printf("on added called on Bar");
    }
}

функция on_added в Bar никогда не вызывается.Что было бы лучшим способом добавить обратный вызов, который подкласс шаблона мог бы по желанию переопределить?Спасибо

Ответы [ 4 ]

4 голосов
/ 15 августа 2010

Использовать «виртуальный» ...

template <typename t>
class Foo {
    void add(T *t) {
        prinf('do some template stuff');
        on_added(t);
    }
    virtual void on_added(T *t) { }
}

struct aaa {}

class Bar : Foo<aaa> {
    void on_added(aaa *object) {
        printf("on added called on Bar");
    }
}
2 голосов
/ 15 августа 2010

Ваша функция on_added в Foo должна быть виртуальной.

0 голосов
/ 15 августа 2010

Все остальные уже ответили на вопрос.Позвольте мне просто добавить, что добавление виртуальных функций нарушает обратную совместимость класса.Итак, если это класс, которым вы управляете, и нет других зависимых классов, тогда да, вы можете перейти и преобразовать on_added в виртуальный, если нет необходимости убедиться, что зависимые модули также перестроены.

0 голосов
/ 15 августа 2010

Вы должны сделать функцию virtual, если хотите, чтобы вызовы в базовом классе использовали реализацию в производном классе:

template <typename t>
class Foo {
    ...
    virtual void on_added(T *t) { }
};

Обратите внимание, что это не относится к шаблонам, но относится квсе классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...