静态和动态演员之间的区别

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)

Joh*_*nck 8

你的两个例子都会做同样的事情,那很好.试试这个:

A* a = new A();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,static_cast意志"成功"(虽然它是未定义的行为),而dynamic_cast意志"失败"(通过返回nullptr,你已经检查过).

您的原始示例没有显示任何有趣的内容,因为它们都成功并且是有效的强制转换.与dynamic_cast的区别在于它允许您检测无效的强制转换.

如果您想知道这是怎么 dynamic_cast做的,请阅读RTTI,运行时类型信息.这是一些额外的簿记,C++在某些情况下会检查对象的类型(这对于此以及使用时都很重要typeid()).