Подтвердить что ты не робот

Можно ли передавать производные классы ссылкой на функцию, принимающую базовый класс в качестве параметра

Скажем, у нас есть абстрактный базовый класс IBase с чистыми виртуальными методами (интерфейс).

Затем мы выводим CFoo, CFoo2 из базового класса.

И у нас есть функция, которая знает, как работать с IBase.

Foo(IBase *input);

Обычный сценарий в таких случаях выглядит следующим образом:

IBase *ptr = static_cast<IBase*>(new CFoo("abc"));
Foo(ptr);
delete ptr;

Но лучше избегать управления указателями, так есть ли способ использовать ссылки в таком сценарии?

CFoo inst("abc");
Foo(inst);

где Foo:

Foo(IBase &input);
4b9b3361

Ответ 1

Да. Вам не нужно увеличивать ваши объекты. Все ссылки/указатели на производные типы преобразуются неявно в ссылки на базовые объекты/указатели, если это необходимо.

Итак:

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

Когда вам нужно сжать, вы можете рассмотреть возможность использования dynamic_cast, если ваши типы являются полиморфными.

Ответ 2

Вы можете отличать объект так же, как указатель. Я помню, что это было обычным явлением при преобразовании char в unsigned char и различных других знаковых сменах в днях.