如何早期&后期绑定是否实现?

时间:2016-08-13 19:52:23

标签: c++

当使用关键字virtual时,如果compliler-linker知道调用者和被调用者在哪里(地址/偏移量保存在表中等),那么所有地址都可以在exe中进行硬编码。那么它不应该被称为早期绑定。如果仅在执行调用者代码时获得地址(来自操作系统的地址?),那么这必须是真正的后期绑定。如果后期绑定是首选,那么为什么编译器 - 链接器无论如何也不想使用它(忽略源代码是否使用了虚拟关键字)?萨姆

1 个答案:

答案 0 :(得分:2)

考虑这个例子:

#include <iostream>
#include <memory>

class Base {
public:
    virtual void foo() = 0;
};

class Derived1: public Base {
public:
    virtual void foo() { std::cout << "impl1" << std::endl; }
};

class Derived2: public Base {
public:
    virtual void foo() { std::cout << "impl2" << std::endl; }
};

int main() {
    int c;
    std::cin >> c;
    std::unique_ptr<Base> inst;
    if (c) inst.reset(new Derived1());
    else inst.reset(new Derived2());
    inst->foo();
}

在这里你不知道在你真正运行程序之前调用了哪个foo()实现。所以是的,C ++具有真正的后期绑定。

后期绑定的缺点是,当callind为虚方法时,开销很小。由于C ++可用于某些超级优化的计算库,因此决定是否使用它是由程序员决定的。

Matteo Italia在评论中指出,虚拟方法阻止了内联。这可能会对性能产生显着影响(与呼叫开销不同,这几乎从不会引起注意)。