Можно ли передавать производные классы ссылкой на функцию, принимающую базовый класс в качестве параметра
Скажем, у нас есть абстрактный базовый класс 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);
Ответы
Ответ 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
и различных других знаковых сменах в днях.