【发布时间】:2017-08-09 10:06:24
【问题描述】:
在我正在进行的一个项目中,我注意到动态向下转换失败。快速的代码检查确认该特定对象实际上从未属于该类型。但是,我看到其他开发人员通过应用静态转换来强制执行相同的转换。
在我看来,这是一种危险的方法并且非常脆弱,如下例所示。这通常不是一种糟糕的编程习惯吗?
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 具有未定义的行为。所以这种方法最终被打破了。
-
您没有
Derived对象。再多的演员也不会改变这一点。
标签: c++ dynamic-cast static-cast