Используйте ключевое слово override

Виртуальные функции, переопределенные в порожденном классе, также являются виртуальными, и согласно стандарту не требуют ключевых слов virtual и override. Однако настоятельно рекомендуется указывать override (virtual при этом указывать избыточно) в целях защиты от попыток изменить сигнатуру функции в базовых классах (это приведет к ошибке компиляции). Кроме того, это позволяет быстро увидеть, что эта функция виртуальная и переопределенная, что особенно актуально при наследовании от порожденного класса.

Неправильно:

class Derived : public Base {
public:
    virtual std::string GetBaseName() const noexcept {
        return GetNode()->name;
    }
    virtual xmlElementType GetType() const noexcept {
        return GetNode()->type;
    }
    // ...
}

Правильно:

class Derived : public Base {
public:
    virtual std::string GetBaseName() const noexcept override {
        return GetNode()->name;
    }
    virtual xmlElementType GetType() const noexcept override {
        return GetNode()->type;
    }
    // ...
}