我尝试使用dynamic_cast
将基类对象强制转换为派生类对象,但dynamic_cast
返回null。是否可以使用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;
}
}
此代码打印出&#34;没有值&#34;。
答案 0 :(得分:16)
由于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)如果expression是多态类型Base的指针或引用,new_type是Derived类型的指针或引用,则执行运行时检查:
a)检查由表达式指向/识别的最派生对象。如果在该对象中,表达式指向/指向Derived的公共基础,并且如果只有一个派生类型的子对象是从由表达式指向/标识的子对象派生的,则转换结果/指向该派生子对象。 (这被称为“垂头丧气”。)
...
c)否则,运行时检查失败。如果在指针上使用
dynamic_cast
,则返回new_type类型的空指针值。如果它在引用中使用,则抛出异常std::bad_cast。
答案 1 :(得分:4)
那是每个设计。当您想要测试指向基类对象的指针是否实际指向子类时,使用dynamic_cast。如果它是一个子类对象,dynamic_cast将为您提供一个有效的指针,如果不是,则只需一个nullptr
。
当你创建一个A
类对象,并且A
不是B
的子类时,dynamic_cast通常会返回一个空指针。