c++ - 动态加载和动态绑定(bind)的区别

标签 c++ dynamic-loading dynamic-binding

C++ 中动态加载和动态绑定(bind)的主要区别是什么?

以及为什么动态加载被称为静态?

最佳答案

这个问题有几个方面。如果我们谈论对象,我们就会谈论动态绑定(bind)。让我们考虑以下情况

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

class Derived : public Base {
public:
   virtual void method() { std::cout << "Derived::method" << std::endl; }
};

// ....

void testMethod(Base* pBase) {
   pBase->method();
}

函数调用在编译时未知,它可能是 Base::method 或 Derived::method,具体取决于 pBase 的运行时类型。这就是为什么它被称为动态绑定(bind)(或后期绑定(bind))的原因,实际的方法调用是在调用实际即将发生时查找的。

另一方面,我们有动态加载和静态加载。这与加载库有关。一种可能性是创建一个静态库——一个带有目标代码的文件——当编译器编译并链接它时,它会链接到你的程序。它在编译后无法更改,因为它 - 这就是名称的来源 - 静态绑定(bind)到您的程序。

如果您要进行动态加载,而不是在编译时将代码添加到您的程序中,您可以在运行时加载它。不同的操作系统提供了不同的方法来做到这一点。对于 Windows 用户,DLL 文件不应该是未知的。它们包含目标代码,当程序请求代码时,它会加载提供代码的 DLL 并执行该代码。这允许您添加不同版本的 DLL,而无需重新编译您的程序(只要签名和一般行为保持不变)- 我们可以说它是动态的。

关于c++ - 动态加载和动态绑定(bind)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17250236/

相关文章:

c++子类访问基类

c++ - 这第二个是什么新东西?

c++ - 使用虚函数的力量

c++ - 何时将 C++ 中的函数标记为虚函数?

c++ - 包含 vector 的结构 vector 的大小(以字节为单位),C++

c++ - 以编程方式创建和签署公钥/私钥对

javascript - 强制动态加载的 JavaScript 不在 google chrome 上缓存

java动态类加载避免java.lang.IllegalAccessError

silverlight - 从外部资源设置 Silverlight 应用程序的配色方案

c++ - 如果我必须重写非虚拟成员函数怎么办