2012-01-08 12 views
6

La situación es así.Prevenir la clase heredera de función virtual primordial de la clase base

class Interface 
{ 
public: 
    virtual void foo() = 0; 
} 

class MyClass : Interface 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 

Quiero que mi usuario creará una clase que hereda de MiClase, y se tendrá que aplicar allí bar().
Pero cómo puedo enfoce ellos no anular foo()? porque es importante para mí usar mi foo().

+0

¿Esto compila? Si es así, no tienes ningún problema, ya que tu foo es privado. Editar: ah, no, no compila ... –

+2

@MrLister: los métodos privados aún pueden ser anulados. –

+0

Es cierto, lo siento. Olvidalo entonces. La respuesta ya ha sido dada. –

Respuesta

13

En C++ 11 puede marcar el método que final para evitar que sea anulado:

class MyClass : Interface 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() final 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 
+0

Gracias, me llevas en la dirección correcta. pero en C++ 11V1.0 'final' se cambió a' sealed'. –

+5

Lea [esta pregunta] (http://stackoverflow.com/questions/7026462). 'sealed' es específico de Microsoft. 'final' se define en §7.6.4 [dcl.attr.final] del estándar C++ 11. –

+0

¡Gracias! Esto es lo que estoy buscando: D – mr5

6

Según otra respuesta, puede utilizar la palabra clave en final 11 (instalación de ese tipo C++ es similar a la palabra clave final de Java).

Para el código C++ 03, puede utilizar CRTP mecanismo (siempre si se puede cambiar la definición de Interface)

template<typename Derived> 
class Interface 
{ 
public: 
    void foo() // not 'virtual' 
    { 
    static_cast<Derived*>(this)->foo(); 
    } 
} 

class MyClass : public Interface<MyClass> 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 

Así que ahora tiene retire el virtual Ness de la foo() y la unión que va a pasar en tiempo de compilación Recuerde que el CRTP tiene su propia limitación, por lo que decidir si usarlo o no depende de usted.

Cuestiones relacionadas