在基类对象上调用派生类的方法

时间:2011-01-05 18:13:14

标签: c++ linux inheritance gcc vtable

我写了几行代码,我觉得不应该编译。我在static_cast-ed指向基类对象的指针上调用派生类的方法,如下所示:

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如何设法做到这一点?

2 个答案:

答案 0 :(得分:1)

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

这里有两种演员表。 static_cast,也就是说,你告诉编译器指向基址的指针是一个指向派生的指针,然后关闭并继续使用它。 dynamic_cast,也就是说,你要求编译器检查指向base的指针是否确实是派生的指针。您使用了static_cast,因此编译器会关闭并按照您的说法执行操作。

编辑:John准确地指出继承层次结构中没有虚函数,您应该从C ++中触发,dynamic_cast仅对虚函数有效。

答案 1 :(得分:0)

使用static_cast&lt;&gt;你告诉编译器“我知道我在做什么,B *实际上是D *,闭嘴,只是做我说的。”