C++ static_cast向下转换有效性

tow*_*120 1 c++

这种static_cast贬低有效吗?

// non-virtual, may be non-trivially copyable
struct Base{
    int m_object;
};

// Derived class have only non-virtual functions
struct A : Base{
    void arggh(){
        std::cout << "Arrghh " << m_object;
    }
};

int main() {
    Base base{190};
    A& a = static_cast<A&>(base);
    a.arggh();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的意思是,CREATE基类,然后转换为派生.

生活

And*_*dyG 7

static_cast执行向下转换不执行任何安全检查.由于有可能为一个Base&被引用的实例A,投收益,因为它是实际的参考A,我们进入未定义行为的领土*.

dynamic_cast另一方面,A 更安全.它将执行检查并在引用转换的情况下抛出异常,或者nullptr在指针转换的情况下返回.

但是,由于您的基类缺少任何虚函数,dynamic_cast因此不可能,因此您需要至少使用虚拟析构函数对其进行修改:

class Base{
public:
    int m_object;
    virtual ~Base()=default;
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我们试图施放:

A* a = dynamic_cast<A*>(&base);
if (a)
    a->arggh();
else
    std::cout << "null\n";
Run Code Online (Sandbox Code Playgroud)

我们的输出将是

空值


*相关标准可以在[expr.static.cast]中找到:

[对于类似于static_cast<D&>(b)其中b的基类实例的转换D],如果类型为" cv1 B " 的对象实际上是类型对象的基类子对象D,则结果引用类型的封闭对象D.否则,行为未定义.

[expr.dynamic.cast]的相关标准

失败的强制转换为指针类型的值是所需结果类型的空指针值.失败的强制转换为引用类型会抛出与类型的处理程序匹配的类型的异常 std::bad_cast

  • 请注意,添加虚拟成员函数并执行 dynamic_cast 会产生性能成本。 (2认同)