代码之家  ›  专栏  ›  技术社区  ›  Adrian

当我调用仅在派生类中虚拟的函数时,幕后会发生什么

c++
  •  0
  • Adrian  · 技术社区  · 10 年前

    这是我的代码:

    class Base {
    public:
        void foo() {
            cout << "Base::foo" << endl;
        }
    };
    
    class Derived : public Base {
    public:
        virtual void foo() {
            cout << "Derived::foo" << endl;
        }
    };
    
    int main()
    {
        Base* base = new Derived;
        base->foo();
    
        return 0;
    }
    

    这将调用 Base::foo 。我对有了这段代码后引擎盖下发生的事情感到好奇。我知道将为 Derived 将包含指向 foo 并且还有一个由初始化的指针 派生的 构造函数,该构造函数将指向包含虚拟函数的表。

    所以结果表明,静态绑定正在发生,我很好奇这是如何发生的?

    我想我有点困惑,因为如果 基础::foo 当时是虚拟的 派生的 v形工作台 基础::foo 将被覆盖 Dervied::foo (现在就是这样)。

    编译代码时,编译器是否看到 基础::foo 不是虚拟的并执行静态绑定?这是答案还是还有其他答案?

    2 回复  |  直到 10 年前
        1
  •  5
  •   Luchian Grigore sgryzko    10 年前

    该调用在编译时解析,就像对非- virtual 作用由于指针的类型 Base* ,以及中的方法 Base 不是虚拟的,不进行查找,基本上被转换为

    base->Base::foo();
    
        2
  •  0
  •   Deduplicator    10 年前

    重载解析在编译时完成,无论这是否会导致 virtual 或非虚拟功能。
    然后生成调用该明确重载的代码,如果合适,将使用虚拟分派。

    如果你在 Base ,编译器不知道,也不关心稍后派生的类可能声明具有相同名称的其他函数;它们当然不是过载集合的一部分。