Может указатель производного класса быть броском типа к указателю его базового класса?

Указатель производного класса, возвращенного новым, может быть слепком типа к указателю его базового класса.

Действительно ли это - TRUE или FALSE?

Я знаю, что dynamic_cast может использоваться для кастинга оборотной стороны. Обычно, как бросить указатель производного класса к указателю его базового класса?

5
задан avakar 28 January 2010 в 16:54
поделиться

4 ответа

Да. Преобразование от указателя на полученный класс к указателю на базовый класс неявно. Таким образом, следующее совершенно хорошо:

struct B { };
struct D : B { };

D* my_d_ptr = new D;
B* my_d_ptr_as_a_b_ptr = my_d_ptr;
14
ответ дан 18 December 2019 в 06:50
поделиться

Это верно, если производный класс наследует 'публично' и 'не виртуально' от базы:

Вы не можете преобразовать 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: добавлены примеры кода, неоднозначный регистр использования, удален пример виртуального наследования.

3
ответ дан 18 December 2019 в 06:50
поделиться

Отливка указателя на полученный к указателю на базу, должно быть неявным. Это вся точка полиморфизма: экземпляр полученного класса всегда должен быть благополучно использоваться в качестве экземпляра базового класса. Поэтому не требуется явный листок.

5
ответ дан 18 December 2019 в 06:50
поделиться

Если есть неожиданный результат, вызовите исключение. Если вы просто хотите, чтобы функция сказала вам «сделал ли я X», то вернуть логическое значение.

-121--2439208-

SCOPE _ IDENTITY () следует извлечь из первой команды ( SELECT , RETURN или OUT ) и передать в следующую команду. Это означает, что SELECT _ IDENTITY () должен находиться в конце первой команды . В SQL 2008 имеется дополнительный синтаксис для возврата значений как части INSERT , что упрощает эту задачу.

Или более эффективно: объедините команды в одну, чтобы избежать обхода.

-121--4780232-

Ваш вопрос не ясен, потому что он смешивает несколько разных вещей.

С одной стороны, указатель на производный класс можно преобразовать в указатель на базовый класс (при условии, что базовый класс доступен). Это естественное преобразование, и нет необходимости, чтобы какой-либо актерский состав делал это.

С другой стороны, вы упоминаете динамический _ и его способность выполнять понижение . Но даункасты идут в обратном направлении: от указателя на базовый класс к указателю на производный класс. Downcasts может выполняться как динамическим _ cast , так и статическим _ cast в зависимости от того, что вам нужно и какой объем проверки времени выполнения требуется.

... И при этом вы говорите о кастинге результата нового , который, конечно, можно только расхаживать, но не принижать.

О чем вы спрашиваете? Upcasts или downcasts?

1
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: