C++ 静态和动态绑定
最编程
2024-04-23 15:11:05
...
在 C++ 中,静态绑定(静态多态)和动态绑定(动态多态)是关于函数调用的两种不同方式,这两种方式是由编译器和运行时系统来处理的。
静态绑定是指在编译时确定调用哪个函数,通常在编译时就能够确定函数的调用路径。这种绑定方式在编译期间就已经确定了,因此也被称为静态多态。静态绑定通常发生在以下情况下:
- 非虚函数调用:对于普通的非虚函数,编译器在编译时就可以确定调用哪个函数。
- 基类指针或引用调用派生类对象的成员函数,但该函数不是虚函数。
class Base {
public:
void foo() {
// Some code...
}
};
class Derived : public Base {
public:
void foo() {
// Some code specific to Derived...
}
};
int main() {
Base b;
Derived d;
Base* ptr = &b;
ptr->foo(); // 调用 Base::foo()
ptr = &d;
ptr->foo(); // 仍然调用 Base::foo(),因为 foo() 不是虚函数
return 0;
}
2. 动态绑定(动态多态)
动态绑定是指在运行时确定调用哪个函数,通常发生在虚函数的调用中。当基类指针或引用调用派生类对象的虚函数时,实际上会根据对象的实际类型来决定调用哪个函数,这种绑定方式直到运行时才能确定,因此也被称为动态多态。
class Base {
public:
virtual void foo() {
// Some code...
}
};
class Derived : public Base {
public:
void foo() override {
// Some code specific to Derived...
}
};
int main() {
Base b;
Derived d;
Base* ptr = &b;
ptr->foo(); // 调用 Base::foo()
ptr = &d;
ptr->foo(); // 调用 Derived::foo(),因为 foo() 是虚函数
return 0;
}
注意:C++ 中,虚函数的行为是动态绑定的,而虚函数的参数是静态绑定的。
上一篇: [自研开源] MyData v0.8 数据整合案例分享
下一篇: 设计模式:命令模式
推荐阅读
-
LED 数码管静态显示屏和动态显示屏(Keil + Proteus)
-
C++ 静态和动态绑定
-
谈API网关和应用网关--从技术选型谈起:API网关的性能是第一指标,一般会选择Kong、Apisix等基于OpenResty+Lua的高性能网关(得益于Ngnix基于C++的高性能无阻塞网络IO模型),应用网关一般是结合自身业务的技术栈来选择,比如SpringCloud Gateway、Zuul等。当然,这也不是绝对的,如果你对 Kong 非常熟悉,用它来做应用网关也不是不可能。 一些开源网关项目的例子: Kong Apisix 特使 Traefik SpringCloud 网关 Zuul / Zuul2 接下来,我们将重点介绍应用网关。在网格中,应用网关侧重于以下功能(与 API 网关不同) 动态路由 服务发现 服务聚合/协调 可观察性 如果您使用的是 Sping 技术栈,使用 SpringCloud Gateway 和 Zuul 可以轻松重用现有类库,如集成您的注册表,使用 Hystrix、resilience4j 完成熔断和限流功能等,快速完成一个生产级可用应用网关,如果引入新的复杂技术栈 成本将直线上升。根据使用场景的不同,性能有时并不是第一指标,但通常我们很容易陷入性能误区。
-
清乡零基教你学51单片机_个人学习笔记(5)_数码管的静态和动态显示
-
TscanCode C/C++ 静态分析开源分析工具的安装和使用
-
详解 C++ 虚拟成员函数和动态链接
-
C++ 虚拟函数、多态实现、静态绑定与动态绑定
-
H3C 交换机 MAC VLAN 原理和配置示例 - 与 Cisco IOS 中基于 MAC 地址的 VLAN 一样,H3C 交换机中基于 MAC 地址的 VLAN 也是一种动态 VLAN 划分方法。它不是静态地将端口划分为特定的 VLAN,而是根据所连接主机的 MAC 地址动态地选择要添加到相应 VLAN 的主机。
-
深入了解网站的静态和动态页面
-
C++ 入门] 第 4 站:类和对象(下)(了解 + 详细)--静态成员