Можно ли передавать производные классы по ссылке на функцию, принимающую базовый класс в качестве параметра - PullRequest
32 голосов
/ 15 февраля 2012

Скажем, у нас есть абстрактный базовый класс 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);

Ответы [ 2 ]

44 голосов
/ 15 февраля 2012

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

Итак:

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, если ваши типы полиморфны.

0 голосов
/ 15 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...