Infatti a me non interessa come si chiami l' attributo privato, bensì il getter che ha un nome non sempre adatto nelle sottoclassi.
Hai scritto:
Il fatto è che _string_list in derived dovrebbe chiamarsi in un' altra maniera per lo scopo, ma di fatto utilizza il nome dei metodi della classe base.
Hai citato _string_list che è un dato membro. E questo io ho commentato.

Ecco un esempio forse più chiaro:
Ho capito che intendi, ma l'esempio è infelice. (Hai definito un costruttore che restituisce qualcosa, il che è vietato.)

Nulla vieta di scrivere (ho modificato un po' per chiarezza):
codice:
struct list
{
    virtual std::list<std::string> get_list() const { return _list; }
private:
    std::list<std::string> _list;
};

struct banned_list : public list
{
    std::list<std::string> get_banned_list() const  { return _list; }
   
};
get_banned_list(), però, non fa parte dell'interfaccia di list pertanto non si può usare con puntatori/reference di tipo list. In pratica non serve.

Qui trovi un manuale con consigli e indicazioni utili per una buona codifica (applicabili in generale, non al caso in questione).
http://www.eptacom.net/pubblicazioni/cpp_stile/all.html