Per*_*kie 2 c++ dynamic-cast static-cast
这个类是多态的.为什么两者都打印相同的输出?
class A
{
public:
virtual void P(){ cout << "A" << endl; }
};
class B : public A
{
public:
void P()override{
cout << "B" << endl;
}
B(){ cout << "Created B" << endl; s = "Created by B"; }
string s;
};
Run Code Online (Sandbox Code Playgroud)
主要:变体1:
A* a = new B(); // Created B
B* b = static_cast<B*>(a);
b->P(); B
cout<<b->s<<endl; // Created by B
Run Code Online (Sandbox Code Playgroud)
变种2:
A* a = new B();
B* b = dynamic_cast<B*>(a);
if (b){
b->P();
cout << b->s << endl; // Prints same
}
Run Code Online (Sandbox Code Playgroud)
你的两个例子都会做同样的事情,那很好.试试这个:
A* a = new A();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,static_cast意志"成功"(虽然它是未定义的行为),而dynamic_cast意志"失败"(通过返回nullptr,你已经检查过).
您的原始示例没有显示任何有趣的内容,因为它们都成功并且是有效的强制转换.与dynamic_cast的区别在于它允许您检测无效的强制转换.
如果您想知道这是怎么 dynamic_cast做的,请阅读RTTI,运行时类型信息.这是一些额外的簿记,C++在某些情况下会检查对象的类型(这对于此以及使用时都很重要typeid()).