2010-02-04 4 views
5

Tengo dos DLL a.dll y b.dll y en cada una tengo una clase AClass y BClass.
Me gustaría que tanto AClass como BClass hereden e implementen la misma interfaz AbsBase que es una clase abstracta pura.
En cada clase configuré #defines para __declspec (dllimport) y __declspect (dllexport). Cuando estoy tratando de compilar me sale esto:¿La clase base pura debe exportarse desde DLL?

C4275 advertencia: no DLL-interfaz de clase 'AClass' se utilizan como base para la clase DLL interfaz 'AbsBase'

que básicamente me quiere declarar AbsBase como __declspec (dllexport)
Pero si el compilador lo hiciera a su manera, tendría que declarar que AbsBase se exporta desde a.dll y b.dll.

¿Por qué se debe exportar la interfaz de una clase?
¿Hay alguna forma de evitarlo? ¿Debo realmente exportar AbsBase de ambas DLL? ¿No hay algo inherentemente malo en esto? (I necesitaría para definir un nuevo macro XXX_EXPORT ..)

+0

¿Puedes hacer una tercera DLL? – jmucchiello

+0

nos muestra su interfaz y declaraciones de clase. –

Respuesta

3

Parece que es una advertencia del compilador y no es un error, por lo que debería funcionar. El compilador solo te está haciendo saber que estás haciendo algo que te hace fácil enredar. Debería ser perfectamente aceptable hacerlo mientras los archivos DLL y el programa principal acuerden la definición de la clase base.

Usted debe ser capaz de utilizar un pragma para suprimir la advertencia:

http://forums.devx.com/archive/index.php/t-84785.html

+1

La respuesta de "ralph" en ese hilo es esclarecedora. @OP: No experimentarás ese problema si Ralph menciona que tu clase base sigue siendo puramente abstracta * para siempre *. –

+0

Hacer que la clase base sea completamente pura virtual resolvió el problema. – shoosh

0

tengo un consejo:

class Base { 
    public: 
    virtual void f() = 0; 
    virtual void g() = 0; 
    virtual ~Base(); 
}; 

class A: public Base { 
    public: 
    virtual void f(); 
    virtual void g(); 
}; 

class B: public Base { 
    public: 
    virtual void g(); // REVERSE ORDER 
    virtual void f(); 
}; 

El orden de f y g en la Tabla método virtual se especifica en la clase base y esta información es muy necesario.

+0

Sí, lo es. Es por eso que está en el archivo de encabezado. –

1

Esto es algo que preocuparse. El compilador ha detectado que el código en la clase base puede ejecutarse. No será un método puro, sino que sabe cómo filtrarlos. ¿Tal vez un constructor o un destructor? El modo de falla es que el diseño de la memoria del objeto de la clase puede no ser el mismo en el código del cliente que en la DLL. El caos en tiempo de ejecución que esto causa es muy difícil de diagnosticar.

Estará bien si puede garantizar que tanto el cliente como la DLL se compilan con la misma configuración de compilación y enlace, usando exactamente las mismas versiones del CRT y esas herramientas. Puede hacer que la clase base garantizada sea abstracta utilizando la palabra clave __interface no estándar en lugar de la clase.

Cuestiones relacionadas