2

我写了几行我认为不应该编译的代码。我在指向基类对象的静态转换指针上调用派生类的方法,如下所示:

class B {};    

class D: public B
{
public:
    void bar() { printf("%d\n", m_i); }
private:
    int m_i;
};

int main()
{
    B b;
    D* d = static_cast<D*>(&b);
    d->bar();
    return 0;
}

打印的值显然是垃圾,但这是否应该编译?如何gcc做到这一点?

4

2 回答 2

1

gcc不能保证它是不正确的,除非在少数情况下它确实不值得检查。当您使用 时static_cast,您承诺编译器您知道 wtf 您正在做的事情。

这里有两种类型的演员表。static_cast,也就是说,您告诉编译器指向基址的指针是指向派生的指针,然后闭嘴继续它。dynamic_cast,也就是说,您要求编译器检查指向 base 的指针是否确实是指向派生的指针。你用static_cast了,所以编译器就闭嘴了,照你说的做了。

编辑:约翰准确地指出,您的继承层次结构中没有虚函数,您应该从 C++ 中被解雇,并且dynamic_cast仅对虚函数有效。

于 2011-01-05T18:18:14.000 回答
0

使用 static_cast<> 你告诉编译器“我知道我在做什么,B* 实际上是 D*,闭嘴,照我说的做。”

于 2011-01-05T18:18:05.417 回答