c++ - resueltos - ¿Es posible pasar clases derivadas por referencia a una función que toma la clase base como un parámetro?
miembros de una clase en programacion orientada a objetos (2)
Digamos que tenemos una clase base abstracta IBase
con métodos virtuales puros (una interfaz).
Luego derivamos CFoo
, CFoo2
de la clase base.
Y tenemos una función que sabe cómo trabajar con IBase.
Foo(IBase *input);
El escenario habitual en estos casos es el siguiente:
IBase *ptr = static_cast<IBase*>(new CFoo("abc"));
Foo(ptr);
delete ptr;
Pero es mejor evitar la gestión de punteros, así que, ¿hay una manera de usar referencias en tal escenario?
CFoo inst("abc");
Foo(inst);
donde Foo
es:
Foo(IBase &input);
Puedes lanzar un objeto al igual que un puntero. Recuerdo que esto era común cuando se convertía char
en char
unsigned char
y en varios otros signos de cambio de modelos en los días de antaño.
Sí. No tienes que subir tus objetos. Todas las referencias / punteros a tipos derivados se convierten implícitamente a referencias / punteros de objetos base cuando sea necesario.
Asi que:
IBase* ptr = new CFoo("abc"); // good
CFoo* ptr2 = static_cast<CFoo*>(ptr); // good
CFoo* ptr3 = ptr; // compile error
CFoo instance("abc");
IBase& ref = instance; // good
CFoo& ref2 = static_cast<CFoo&>(ref); // good
CFoo& ref3 = ref; // compile error
Cuando tenga que dynamic_cast
, puede considerar el uso de dynamic_cast
, si sus tipos son polimórficos.