12

que tienen una clase base y un derivado de uno y quiero cambiar las funciones de base mientras que los mantiene estática, ya que se deben pasar a otras funciones como estática.funciones virtuales estáticos en C++

¿Cómo puedo hacer eso?

+1

Dar un ejemplo concreto, mínima y completa de lo que está tratando de lograr (_No_ lo que piensa que desea implementar), y podemos pensar en cómo hacerlo. –

Respuesta

2

función estática no puede ser virtual, ya que no tienen una instancia a través del cual se accede a ellos. Aunque creo que puedes sobrescribirlos.

+0

sé que no puedo usar estática y virtual al mismo tiempo, pero tengo que hacer algo como eso – fank

+0

simplemente no hay forma de hacerlo. use el truco del puntero a la función (que desaconsejaría fuertemente) o elimine la restricción estática. Si el método estático se usa para crear un instance, tenga un alook en el patrón de fábrica (http://programmerjoe.com/2007/03/18/the-abstract-factory-pattern-in-c/) –

1

No puede tener funciones virtuales estáticas en C++.

+1

Por favor amplíe su respuesta. – emdog4

-1

No puede tener funciones virtuales estáticas, porque no tiene sentido tenerlas.

funciones
+7

En realidad, puede tener sentido: es como cualquier otra función virtual donde la implementación cambia en función del tipo derivado de la clase. Es solo que no tienes una instancia. [Delphi] (http://docwiki.embarcadero.com/RADStudio/en/Methods#Ordinary_Class_Methods), por ejemplo, lo permite y puede ser bastante útil. –

1

virtuales normalmente se basan en this puntero para determinar el tipo de función que se llamará en tiempo de ejecución.

una función miembro estática no pasa un this funciones virtuales tan estáticos no están permitidos en C++.

0

Si estoy en lo correcto en la comprensión del ur pregunta, entonces u puede seguir el siguiente enfoque de lo contrario ignorar ..

tienen puntero de función estática en la clase base.

en la clase de base tienen una función estática (en el que u llamar a la función mediante el uso de ese puntero función estática) ..

en las clases derivadas establece que la función poiter estática a la defination función u desea ejecutar .. (en la clase base, puede configurar el puntero a alguna función predeterminada).

+0

que hice algo por el estilo hago una función estática y una virtual en la clase base, y la estática llama el virtual después de que se cambió en la clase derivada, pero ahora el problema es la virtual no ir a clase derivada por lo que no cambia – fank

+0

@frank Hola, no estoy pidiendo u para tener una función virtual ... quiero u para tener un puntero de función estática, y un regulador para esa variable ... que u ur llamada de subclases .... y en su función estática principal, simplemente llame a la función utilizando ese puntero de función. – Nik

3

Qué quiere decir que necesita un puntero a una función estática (por ejemplo, para pasar como argumento a otra función que requiere un puntero a una función estática), pero hay que acceder a ese puntero de función virtual? En ese caso, utilizar una función virtual para obtener la función de puntero:

typedef void (*function)(); 
void do_stuff_with_function(function); 

struct Base { 
    virtual ~Base() {} 
    virtual function get_function() = 0; 
}; 

struct Derived : Base { 
    function get_function() {return my_function;} 
    static void my_function(); 
}; 

Derived d; 
do_stuff_with_function(d.get_function()); 
22

El marco ATL recibe alrededor de la limitación de no estática virtuales haciendo que la clase base sea una plantilla, y luego tener clases derivadas pase su tipo de clase como un parámetro de plantilla. La clase base puede entonces llamar a la estática de clase derivados cuando sea necesario, por ejemplo:

template< class DerivedType > 
class Base 
{ 
public: 
    static void DoSomething() { DerivedType::DoSomethingElse(); } 
}; 

class Derived1 : public Base<Derived1> 
{ 
public: 
    static void DoSomethingElse() { ... } 
}; 

class Derived2 : public Base<Derived2> 
{ 
public: 
    static void DoSomethingElse() { ... } 
}; 

Esto se conoce como Curiously recurring template pattern, que puede ser utilizado para implementar polimorfismo estático.

+0

Este diseño es exactamente lo que necesito, pero hay un problema. ¿Cómo se puede usar 'Base ' cuando se declara 'clase Derived1'? Quiero decir, esto me causa errores: 'error: esperaba un tipo, obtuvo 'Derived1'' y' error: tipo/valor no coincide en el argumento ... '. –

+0

Intenta cambiar 'typename' por' class'. Y lea esto: [Patrón de plantilla curiosamente recurrente] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). –

+0

¡Bonito! No sabía sobre ese diseño. Eso está funcionando ahora, muchas gracias. Ya +1 tu respuesta. –

Cuestiones relacionadas