静态绑定和动态绑定
概念解释
-
对象的静态类型:
- 对象在声明时采用的类型,在编译期确定,无法更改。
-
对象的动态类型:
- 对象在运行期实际表现的类型,在运行期决定,对象的动态类型可以更改(通过多态和指针/引用的方式)。
-
静态绑定:
- 绑定的是对象的静态类型,某特性(比如函数调用)依赖于对象的静态类型,发生在编译期。
-
动态绑定:
- 绑定的是对象的动态类型,某特性(比如函数调用)依赖于对象的动态类型,发生在运行期。通常通过虚函数实现。
代码示例
下面的代码示例展示了静态绑定和动态绑定的区别。
#include <iostream>
// 基类
class Base {
public:
// 静态绑定的函数
void staticFunc() {
std::cout << "Base staticFunc" << std::endl;
}
// 动态绑定的函数
virtual void dynamicFunc() {
std::cout << "Base dynamicFunc" << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
// 静态绑定的函数
void staticFunc() {
std::cout << "Derived staticFunc" << std::endl;
}
// 动态绑定的函数,覆盖基类的虚函数
virtual void dynamicFunc() override {
std::cout << "Derived dynamicFunc" << std::endl;
}
};
int main() {
Base base; // 静态类型和动态类型均为 Base
Derived derived; // 静态类型和动态类型均为 Derived
Base* ptr; // 指针,静态类型为 Base
// 静态类型决定绑定
ptr = &base;
ptr->staticFunc(); // 输出: Base staticFunc
ptr = &derived;
ptr->staticFunc(); // 输出: Base staticFunc (静态绑定到 Base)
// 动态类型决定绑定
ptr = &base;
ptr->dynamicFunc(); // 输出: Base dynamicFunc
ptr = &derived;
ptr->dynamicFunc(); // 输出: Derived dynamicFunc (动态绑定到 Derived)
return 0;
}
解释
-
静态绑定:
staticFunc
是一个非虚函数,因此它被静态绑定。即在编译期,函数调用被解析为基类的staticFunc
,无论指针指向的是Base
还是Derived
对象。- 当调用
ptr->staticFunc()
时,虽然ptr
指向不同的对象(Base
和Derived
),但输出的都是基类的staticFunc
。
-
动态绑定:
dynamicFunc
是一个虚函数,因此它被动态绑定。在运行期,函数调用根据对象的动态类型进行解析。- 当调用
ptr->dynamicFunc()
时,函数调用根据对象的动态类型决定。如果ptr
指向Base
对象,调用基类的dynamicFunc
;如果ptr
指向Derived
对象,调用派生类的dynamicFunc
。
总结
- 静态类型 在编译期确定,无法更改;静态绑定依赖于对象的静态类型,函数调用在编译期解析。
- 动态类型 在运行期决定,可以更改;动态绑定依赖于对象的动态类型,函数调用在运行期解析。
希望这些解释和示例能帮助你更好地理解静态绑定和动态绑定的概念。
标签:静态,staticFunc,绑定,C++,对象,vs,动态,ptr From: https://blog.csdn.net/m0_72877724/article/details/139755375