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

Rik*_*ken 0 c++ oop polymorphism inheritance object

鉴于以下代码块:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

Col*_*lin 6

DerivedClass被构造,一个不可见的构件被插入到它的数据.那个成员指向一个叫做a的东西vtable.vtable具有指向派生类的虚函数实现的函数指针.

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

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