Я пытаюсь привести объект базового класса к производному объекту класса с 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;
}
}
Этот код выводит «нет значения».
Так как 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 брошен
То есть по дизайну. dynamic_cast используется, когда вы хотите проверить, действительно ли указатель на объект базового класса указывает на подкласс или нет. Если это объект подкласса, dynamic_cast даст вам действительный указатель, а если нет, вы просто получите nullptr
,
Как вы создали A
объект класса, и и A
не подкласс B
, dynamic_cast обычно возвращает нулевой указатель.