Pregunta

Estoy leyendo de las plantillas de libros electrónicos Guía y pregunta completa que voy a hacer que te sea estúpido pero ...

Hay sección en esa 9.4.2 Clases base dependientes que no puedo entender.

Aquí está el texto parcial de él: http://tinypaste.com/633f0

// Variation 2: 
template<typename T> 
class DD2 : public Base<T> { 
  public: 
    void f() { Base<T>::basefield = 0; } 
}; 

Necesito ayuda para visualizar la línea (o dominio del problema) en el texto anterior "Se debe tener cuidado con esta solución, porque si el nombre no dependiente no calificado se usa para formar una llamada de función virtual, entonces la calificación inhibe el mecanismo de llamada virtual y el significado del programa cambia. No obstante, hay situaciones en las que no se puede usar la primera variación y esta alternativa es apropiada "

Entiendo el nombre no dependiente no calificado, etc., pero mezclarlos con la llamada de función virtual es lo que me elude.

¿Fue útil?

Solución

Si el nombre calificado (BaseField) es una función virtual, entonces la calificación inhibe la llamada virtual. Es muy parecido a que tenías:

struct Base {
  virtual void vCall() { }
};

struct Derived : public Base {
  virtual void vCall() { }
};

int main() {
  Derived d;
  Base* inst = &d;
  inst->Base::vCall(); // By qualifying we won't get virtual dispatch;
                       // this calls Base::vCall directly
}

Otros consejos

Usando un identificador calificado class-name::function() inhibe la virtual function, entonces debes usar this->function() en cambio.

Esto también funciona para los miembros de datos: this->basefield.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top