static_cast - 为什么在这里工作?

时间:2014-04-02 20:04:39

标签: c++ static-cast

我有以下代码段

class base
{
public:
    virtual void MyMethod()
    {
        std::cout << "Base MyMethod" << "\n";
    }
};


class der : public base
{
public:
    virtual void MyMethod()
    {
        std::cout << "Derived MyMethod" << "\n";
    }
};


void foo(base* b)
{
    der* d = static_cast<der*>(b);
    d->MyMethod();
}

int main()
{
    base* b = new der();
    foo(b);
}

现在我的问题是为什么static_Cast在这里工作。我读到static_casts无法通过多态类型进行转换。那么为什么上面的例子有效 - 我在这里遗漏了什么?我期待动态演员只能解决这个问题,因为它们应该与多态类型一起使用?任何人都可以给出一个静态转换会失败并且动态转换会通过的示例吗?

2 个答案:

答案 0 :(得分:3)

  

“现在我的问题是为什么static_cast在这里工作。”

没有理由不这样做。这些类型通过类派生来关联,并且编译器已知这些类型。基本上static_cast仅限于执行或撤消任何隐式转换,并且您确实有从der*base*的隐式转换。

  

“我读到static_cast无法通过多态类型转换。”

那只是balderdash。

  

“[snip]任何人都可以举例说明static cast会失败并且dynamic cast会通过吗?”

struct A { virtual ~A(){} };
struct B { virtual ~B(){} };

struct T: A, B {};

auto main()
    -> int
{
    T o;
    A& oA = o;
    //B& oB = static_cast<B&>( oA );    //! This won't compile, unrelated types.
    B& oB = dynamic_cast<B&>( oA );
}

答案 1 :(得分:2)

通常使用dynamic_cast来将基指针强制转换为派生指针。这是因为base指向的对象实际上可能不是派生类型。因此dynamic_cast执行运行时检查,如果对象不兼容则返回空指针。

但是这次运行时检查的性能成本很低。如果您完全确定程序的逻辑,那么转换将成功,您可以使用static_cast来阻止运行时检查。但是如果你得到错误的对象类型,你将得到未定义的行为。

相关问题