Указатель производного класса, возвращенного новым, может быть слепком типа к указателю его базового класса.
Действительно ли это - TRUE или FALSE?
Я знаю, что dynamic_cast может использоваться для кастинга оборотной стороны. Обычно, как бросить указатель производного класса к указателю его базового класса?
Да. Преобразование от указателя на полученный класс к указателю на базовый класс неявно. Таким образом, следующее совершенно хорошо:
struct B { };
struct D : B { };
D* my_d_ptr = new D;
B* my_d_ptr_as_a_b_ptr = my_d_ptr;
Это верно, если производный класс наследует 'публично' и 'не виртуально' от базы:
Вы не можете преобразовать Derived*
в Base*
ни неявно, ни используя static_cast/dynamic_cast (C-cast сделает эту работу, но вы должны подумать дважды, прежде чем использовать этот хакер! );
class Base { };
class Derived : protected Base { };
int main()
{
Base* b = new Derived(); // compile error
}
Также не работает, если базовый класс неоднозначен:
class Base { };
class Derived1 : public Base { };
class Derived2 : public Base { };
class MostDerived : public Derived1, Derived2 { };
int main()
{
Base* b = new MostDerived(); // won't work (but you could hint compiler
// which path to use for finding Base
}
Edit: добавлены примеры кода, неоднозначный регистр использования, удален пример виртуального наследования.
Отливка указателя на полученный к указателю на базу, должно быть неявным. Это вся точка полиморфизма: экземпляр полученного класса всегда должен быть благополучно использоваться в качестве экземпляра базового класса. Поэтому не требуется явный листок.
Если есть неожиданный результат, вызовите исключение. Если вы просто хотите, чтобы функция сказала вам «сделал ли я X», то вернуть логическое значение.
-121--2439208- SCOPE _ IDENTITY ()
следует извлечь из первой команды ( SELECT
, RETURN
или OUT
) и передать в следующую команду. Это означает, что SELECT _ IDENTITY ()
должен находиться в конце первой команды . В SQL 2008 имеется дополнительный синтаксис для возврата значений как части INSERT
, что упрощает эту задачу.
Или более эффективно: объедините команды в одну, чтобы избежать обхода.
-121--4780232-Ваш вопрос не ясен, потому что он смешивает несколько разных вещей.
С одной стороны, указатель на производный класс можно преобразовать в указатель на базовый класс (при условии, что базовый класс доступен). Это естественное преобразование, и нет необходимости, чтобы какой-либо актерский состав делал это.
С другой стороны, вы упоминаете динамический _
и его способность выполнять понижение . Но даункасты идут в обратном направлении: от указателя на базовый класс к указателю на производный класс. Downcasts может выполняться как динамическим _ cast
, так и статическим _ cast
в зависимости от того, что вам нужно и какой объем проверки времени выполнения требуется.
... И при этом вы говорите о кастинге результата нового
, который, конечно, можно только расхаживать, но не принижать.
О чем вы спрашиваете? Upcasts или downcasts?