编译f有效,但编译g因错误而失败。
为什么会出现这种情况?
class A {
public:
A() {}
};
class B : public A {
public:
B() {}
};
void f() {
A* a = new A();
B* b = static_cast<B*>(a);
}
void g() {
A* a = new A();
B* b = a;
}
A static_cast
强制进行可能不安全的转换。
B* b = static_cast<B*>(a);
这将是有效的,如果a
指向一个A
实际上是 a 的基类子对象的对象B
对象,但事实并非如此。演员阵容强制转换。
B* b = a;
这里没有强制转换,并且(正确地)不允许从基类指针到派生类指针的隐式转换。指向派生类的指针始终可以转换为指向基类的指针,因为派生类对象始终包含基类子对象,但并非每个基类实例都是特定派生类类型的子对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)