Estoy envolviendo una jerarquía simple de herencia C++ en "orientada a objetos" C. Estoy tratando de averiguar si hay errores al tratar los punteros a objetos C++ como punteros a opacos C construye. En particular, ¿bajo qué circunstancias la conversión derivada a la base causaría problemas?Envoltura C++ en C: derivadas a conversiones base
Las clases mismas son relativamente complejos, pero la jerarquía es poco profunda y utiliza una sola herencia única:
// A base class with lots of important shared functionality
class Base {
public:
virtual void someOperation();
// More operations...
private:
// Data...
};
// One of several derived classes
class FirstDerived: public Base {
public:
virtual void someOperation();
// More operations...
private:
// More data...
};
// More derived classes of Base..
Estoy pensando en la exposición de este a clientes de C a través de la siguiente, bastante estándar orientado a objetos C:
// An opaque pointers to the types
typedef struct base_t base_t;
typedef struct first_derived_t first_derived_t;
void base_some_operation(base_t* object) {
Base* base = (Base*) object;
base->someOperation();
}
first_derived_t* first_derived_create() {
return (first_derived_t*) new FirstDerived();
}
void first_derived_destroy(first_derived_t* object) {
FirstDerived* firstDerived = (FirstDerived*) object;
delete firstDerived;
}
los clientes de C solamente pasar alrededor de punteros a los objetos subyacentes de C++ y sólo puede manipularlos a través de llamadas a funciones. Así el cliente puede finalmente hacer algo como:
first_derived_t* object = first_derived_create();
base_some_operation((base_t*) object); // Note the derived-to-base cast here
...
y tienen la llamada virtual a FirstDerived :: someOperation() tener éxito como se esperaba.
Estas clases no son standard-layout pero no usan herencia múltiple o virtual. ¿Esto está garantizado para funcionar?
Tenga en cuenta que tengo control sobre todo el código (C++ y el contenedor C), si eso es importante.
Simplemente use 'void *' en todas partes como su tipo opaco. –