use*_*398 4 c++ dynamic-cast downcast
我正在尝试将基类对象强制转换为派生类对象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;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码打印出"无价值".
son*_*yao 16
因为a实际上指的A不是a B,那么dynamic_cast就会失败.
是否有可能使用
dynamic_cast?
是的,你可以,例如,如果完全a指向B,
A* a = new B;
B* b = dynamic_cast<B*>(a);
Run Code Online (Sandbox Code Playgroud)
请参见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.
这是每个设计。dynamic_cast 用于测试指向基类对象的指针是否实际指向子类。如果它是一个子类对象,则 dynamic_cast 会给你一个有效的指针,如果不是,你只会得到一个nullptr.
由于您创建了一个A类对象,并且A不是 的子类B,因此 dynamic_cast 通常返回一个空指针。
| 归档时间: |
|
| 查看次数: |
5532 次 |
| 最近记录: |