Adr*_*der 0 c++ dynamic-cast static-cast
在我正在工作的项目中,我注意到动态向下转换失败了.快速代码检查证实,特定对象实际上从不属于那种类型.但是,我看到其他开发人员通过应用静态强制转换强制执行此非常相同的强制转换.
在我看来,这是一种危险的方法,非常脆弱,如下例所示.这通常不是一个糟糕的编程习惯吗?
class Base
{
public:
    Base(){ m_p = 0; }
protected:
    int m_p;
};
class Derived: public Base
{
public:
    Derived(){ m_arr = new int[1]; }
    void Add_A() { m_p += 2; }
    void Add_B() { m_arr[0] += 3; }
private:
    int* m_arr;
};
Base* parent = new Base();
// obviously fails -> c_d is null
Derived* c_d = dynamic_cast<Derived*>(parent); 
Derived* c_s = static_cast<Derived*>(parent);
c_s->Add_A(); // works
c_s->Add_B(); // crashes, since m_arr does not exist.
使用static_cast ,因为该dynamic_cast故障不只是不好的做法,它几乎可以保证你的代码是不正确和破碎.正如您在崩溃中所展示的那样,您应该永远不要这样做并实际修复代码,使用其他强制转换并不能解决您的任何问题.
但是,是有原因的有向下转型static_cast,即dynamic_cast的运行成本.如果您完全确定 a dynamic_cast将始终成功,则可以将其替换为static_cast性能约束要求的位置.
(虽然在任何情况下你都应该重新考虑为什么你需要首先进行向下转换.另外,如果dynamic_cast你的用例实际上太慢了,你很可能不希望开始虚函数调用.)
| 归档时间: | 
 | 
| 查看次数: | 202 次 | 
| 最近记录: |