Могу ли я конвертировать совместимые не указательные объекты без фактического определения оператора приведения? Так что, если B наследует от A:
A a;
B b;
Будет (A)b
компилировать, если я не предоставлю свой собственный оператор приведения?
Редактировать: кажется, для компиляции. Это потому, что существует оператор приведения преобразования по умолчанию или компилятор распознает совместимость и использует конструктор копирования по умолчанию или оператор присваивания, например, в присваиваниях?
Да, это компилируется (http://ideone.com/CXbeh0)
По умолчанию A
копируемый Конструктор копирования имеет подпись A::A(A const &)
, С момента появления B
неявно конвертируется в A const &
, бросок будет решен с помощью A
Копируй конструктор.
Преобразование в ссылку также применяется к (также неявно сгенерированному) оператору присваивания копии, поэтому a = b
снова компилируется с помощью A &A::operator=(A const &)
,
Имейте в виду, что новый объект имеет тип A, а не B, поэтому он не содержит никакой дополнительной информации, которую сделал первоначальный экземпляр B. Это редко то, что вы хотите.
Напомним, что в C ++ рекомендуется забыть о существовании приведения в стиле C и использовать более конкретные типы приведения C ++:
static_cast
Только для совместимых типов.dynamic_cast
для перемещения указателей / ссылок во время выполненияconst_cast
обрабатывать только конст.reinterpret_cast
если вам действительно нужно играть с указателями, но остерегайтесь правил наложения имен.Никакие определяемые пользователем конструкторы или операторы не определены, тогда:
(A)b
будет реализовано так, как если бы:
A(b) //Calls A copy-constructor: A::A(const A&)
То есть он создаст временную конструкцию A из аргумента.
Это называется сращивание объектов и обычно это плохая идея, потому что вы копируете одни поля B, но не копируете другие. YMMV.