【问题标题】:How is the underlying type of an object determined at runtime?对象的底层类型是如何在运行时确定的?
【发布时间】:2012-05-02 08:51:20
【问题描述】:

给定以下代码块:

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 的本机代码。

【问题讨论】:

标签: c++ oop inheritance object polymorphism


【解决方案1】:

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

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

当编译器看到bp-&gt;hello()时,它就知道去寻找那个vtable指针,并调用正确的函数。

【讨论】:

  • 谢谢,正是我想要的。
猜你喜欢
  • 2015-07-17
  • 1970-01-01
  • 2010-11-16
  • 2013-03-31
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多