2012-03-25 17 views
40

Duplicar posible:
C++ static virtual members?¿Podemos tener funciones virtuales estáticas? Si no, ¿POR QUÉ?

podemos tener una función virtual estáticas? Si no, ¿POR QUÉ?

class X 
{ 
public: 
     virtual static void fun(){} // Why we cant have static virtual function in C++? 
}; 
+0

Una posible solución es hacer que un método estático (pero no virtual) en la clase base y hacerlo de compra equivalentes método estático en la clase Derivada. De esta manera, aún conservas la encapsulación y el polimorfismo. – anni

Respuesta

53

No, porque no tiene ningún sentido en C++.

Las funciones virtuales se invocan cuando tiene un puntero/referencia en una instancia de una clase. Las funciones estáticas no están vinculadas a una instancia particular, están vinculadas a una clase. C++ no tiene punteros a clase, por lo que no hay ningún escenario en el que pueda invocar virtualmente una función estática.

+4

"¿No tiene sentido"? ¿Qué hay de los métodos de clase en Python? – Mehrdad

+0

@Mehrdad: No conozco Python. ¿Podrías elaborar? –

+0

http://stackoverflow.com/a/38276/541686 – Mehrdad

14

Eso no tendría sentido. El objetivo de las funciones de miembro virtual es que se envían en función del tipo dinámico de la instancia de objeto en el que se llaman. Por otro lado, las funciones estáticas no están relacionadas con ninguna instancia y son más bien una propiedad de la clase . Por lo tanto, no tiene sentido que sean virtuales. Si debe, se puede utilizar un despachador no estático:

struct Base 
{ 
    static void foo(Base & b) { /*...*/ } 

    virtual ~Base() { } 
    virtual void call_static() { foo(*this); /* or whatever */ } 
}; 

struct Derived : Base 
{ 
    static void bar(int a, bool b) { /* ... */ } 

    virtual void call_static() { bar(12, false); } 
}; 

Uso:

Base & b = get_instance(); 
b.call_static(); // dispatched dynamically 

// Normal use of statics: 
Base::foo(b); 
Derived::bar(-8, true); 
+10

Sigues diciendo que "no tiene sentido", pero el ejemplo que proporcionas muestra que podría ser razonable que un idioma decida admitir, llamando a una función estática en una clase derivada. – Inverse

+2

@Inverse ¿qué otra cosa podría ser 'Base' en tiempo de ejecución, excepto' Base'? –

+2

Puede tener sentido si la función es puramente virtual CON un cuerpo. Entonces el compilador tendría errores si no lo sobrecarga en su clase derivada. Piense en una función getInstance() por ejemplo para hacer singleton. Es posible que desee tener un contrato que diga que cada clase que se deriva de esta Base debe tener una getInstance(). Desea que el compilador lo compruebe por usted. – xryl669

Cuestiones relacionadas