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

How is the underlying type of an object determined at runtime?

本文关键字:类型 对象 运行时      更新时间:2023-10-16

给定以下代码块:

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 现在指向派生类?我也来自 C#,所以这个想法对我来说很陌生,因为这是没有 CLR 的本机代码。

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

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

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