如何在运行时确定对象的基础类型?

时间:2012-04-20 18:47:55

标签: c++ oop inheritance object polymorphism

给出以下代码块:

class BaseClass
{
public:
    virtual void hello() { cout << "Hello from Base" << endl; }
};

class DerivedClass : public BaseClass
{
public:
    void hello() { cout << "Hello from Derived" << endl; }
};

int main()
{
    BaseClass base;
    DerivedClass derv;

    BaseClass* bp = &base;
    bp->hello();
    bp = &derv;
    bp->hello();
}

bp指向的类型在运行时是如何确定的?我知道它是动态绑定的,但这样做的机制是什么? 我很困惑,因为通常答案是编译器,但是因为它是动态的,在这个例子中不是这种情况(或者我错了?我认为编译器提前了,但是什么表明bp现在指向DerivedClass?)。我也来自C#,所以这个想法对我来说很陌生,因为这是没有CLR的原生代码。

1 个答案:

答案 0 :(得分:6)

构造DerivedClass时,会在其数据中插入一个不可见成员。该成员指向一个名为vtable的东西。 vtable具有指向派生类的虚函数实现的函数指针。

每个具体的类(可以实例化的类)在内存中的某个地方都有自己的vtable。只有拥有虚函数才能生成这些表,这是C ++关于不为不使用的东西付费的座右铭的一部分。

当编译器看到bp->hello()时,它知道要查找该vtable指针,并调用正确的函数。