Даункастинг с использованием dynamic_cast возвращает ноль

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

struct A {
virtual ~A() {}
};

struct B : A {};int main()
{
A* a = new A();

B* b = dynamic_cast<B*>(a);
if(b){
std::cout << "b has value" << std::endl;
}else{
std::cout << "no value" << std::endl;
}
}

Этот код выводит «нет значения».

3

Решение

Так как a указывает на A на самом деле, не B, затем dynamic_cast не удастся.

Можно ли убить, используя dynamic_cast?

Да, вы можете, например, если a указывает на B именно так,

A* a = new B;
B* b = dynamic_cast<B*>(a);

Увидеть http://en.cppreference.com/w/cpp/language/dynamic_cast

5) Если выражение является указателем или ссылкой на полиморфный тип Base, а new_type является указателем или ссылкой на тип Производный, выполняется проверка во время выполнения:

а) Исследуется наиболее производный объект, указанный / идентифицированный выражением. Если в этом объекте выражение указывает / относится к общедоступной базе Derived, и если только один подобъект типа Derived получен из подобъекта, указанного / идентифицированного выражением, то результат точек приведения / ссылается на этот производный подобъект. (Это известно как «удрученный».)

в) В противном случае проверка во время выполнения завершится неудачно. Если dynamic_cast используется в указателях, возвращается значение нулевого указателя типа new_type. Если он использовался в ссылках, исключение станд :: bad_cast брошен

15

Другие решения

То есть по дизайну. dynamic_cast используется, когда вы хотите проверить, действительно ли указатель на объект базового класса указывает на подкласс или нет. Если это объект подкласса, dynamic_cast даст вам действительный указатель, а если нет, вы просто получите nullptr,

Как вы создали A объект класса, и и A не подкласс B, dynamic_cast обычно возвращает нулевой указатель.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector