¿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);
Author: Coder, 2012-02-15

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.

 41
Author: gwiazdorrr,
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.

 0
Author: John,
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