2010-04-06 11 views
6

¿Tiene C++ una implementación adecuada de la interfaz que no utiliza vtable?¿C++ tiene una implementación de polimorfismo estático de interfaz que no usa vtable?

por ejemplo

class BaseInterface{ 
public: 
virtual void func() const = 0; 
} 

class BaseInterfaceImpl:public BaseInterface{ 
public: 
void func(){ std::cout<<"called."<<endl; } 
} 

BaseInterface* obj = new BaseInterfaceImpl(); 
obj->func(); 

la llamada a func en la última línea va a VTABLE para encontrar el PTR func de BaseInterfaceImpl :: func, pero ¿hay alguna manera de C++ para hacerlo directamente como el BaseInterfaceImpl no es subclassed de cualquier otra clase además de la clase de interfaz pura BaseInterface?

Gracias. Gil.

+0

¿Por qué te importa si pasa por el vtable? – Thomas

+0

porque estoy trabajando en un proyecto donde la velocidad sí importa. Además, creo que Vtable es una gran solución para el polimorfismo completo oo pero una exageración para implementar 'interfaz' y espero que exista alguna solución más ligera. – gilbertc

+0

@gilbertc: Creo que hay un malentendido aquí. * Cualquier implementación * "adecuada" del concepto de interfaces pasará por algo así como un vtable. De lo contrario, el polimorfismo dinámico sería imposible. – Thomas

Respuesta

7

Sí. Va por el apodo CRTP. Tener un ganso

+0

En particular, el encabezado "Polimorfismo estático": http://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism Tal vez podría editar eso ejemplo en tu respuesta? – Thomas

+0

@Thomas: gracias. ed. – gilbertc

+0

No hay problema. Soy bastante curioso, ¿tu código está optimizado en el que incluso la pequeña sobrecarga de una búsqueda vtable está perjudicando el rendimiento? ¿Qué aplicación? Normalmente se usa como un ahorro de espacio o en una implementación de preocupación RAII. – wheaties

0

Creo que en cualquier idioma, tendrá que ir a algún equivalente de un vtable para hacer el envío dinámico a menos que sepa en tiempo de compilación a qué función se debe llamar. Esto podría ser el resultado de una inteligente optimización del compilador o una técnica como CRTP (que ya se mencionó anteriormente).

+0

y, por cierto, no puedo entender qué pasa con el vtable hace que tal llamada sea "incorrecta". – rmeador

+0

@thomas, rmeador: acordé que no debería usar la palabra propiamente dicha. debe estar en la dirección de implementación de la interfaz 'más eficiente' y 'ligera'. – gilbertc

Cuestiones relacionadas