Apesar de todas as chamadas para declarar um membro virtual privado, o argumento simplesmente não é válido. Freqüentemente, a substituição de uma função virtual por uma classe derivada precisará chamar a versão da classe base. Não pode se for declarado private
:
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
Você precisa declarar o método da classe base protected
.
Então, você deve tomar o feio expediente de indicar, por meio de um comentário, que o método deve ser substituído, mas não chamado.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Assim, a diretriz 3 de Herb Sutter ... Mas o cavalo está fora do estábulo de qualquer maneira.
Quando você declara algo protected
que está implicitamente confiando no escritor de qualquer classe derivada para entender e usar adequadamente os internos protegidos, da mesma maneira que uma friend
declaração implica em uma confiança mais profunda para os private
membros.
Os usuários que têm mau comportamento por violar essa confiança (por exemplo, rotulados como 'sem noção' por não se preocuparem em ler sua documentação) são os únicos culpados.
Atualizar : recebi alguns comentários que afirmam que você pode "encadear" implementações de funções virtuais dessa maneira usando funções virtuais privadas. Se sim, com certeza gostaria de vê-lo.
Os compiladores C ++ que eu uso definitivamente não permitem que uma implementação de classe derivada chame uma implementação de classe base privada.
Se o comitê C ++ relaxasse "private" para permitir esse acesso específico, eu seria totalmente a favor de funções virtuais privadas. Como está, ainda estamos sendo aconselhados a trancar a porta do celeiro depois que o cavalo for roubado.