¿Es posible pasar clases derivadas por referencia a una función tomando la clase base como parámetro
Digamos que tenemos una clase base abstracta IBase
con métodos virtuales puros (una interfaz).
Entonces 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 así:
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
está:
Foo(IBase &input);
2 answers
Sí. No tienes que envidiar tus objetos. Todas las referencias / punteros a tipos derivados se convierten implícitamente a referencias/punteros de objetos base cuando es necesario.
Así 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 bajar, puede considerar usar dynamic_cast
, si sus tipos son polimórficos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-14 23:30:09
Puede lanzar un objeto al igual que un puntero. Recuerdo que esto era común al convertir char
a unsigned char
y varios otros moldes de cambio de signo en días de antaño.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-14 23:16:39