首页 > 其他分享 >静态绑定 动态绑定

静态绑定 动态绑定

时间:2024-01-10 20:33:22浏览次数:34  
标签:调用 函数 Show 静态 绑定 Derived 动态

        在面向对象编程中,静态绑定和动态绑定是两种方法,用于确定程序调用哪个函数(特别是当使用继承和多态时)。这两种方法本质上是根据对象的类型来决定函数调用如何解析。

静态绑定(Static Binding)

静态绑定,又称为早期绑定,是编译时完成的函数调用解析过程。编译器根据调用函数时使用的变量或表达式的类型来确定应当调用哪个函数。在编译时,编译器有足够的信息来确定需要调用的确切函数,结果是在生成的机器代码中直接包含了函数调用的地址。

静态绑定通常用于非虚函数(non-virtual functions)、类的静态成员函数和全局函数。这意味着不能通过派生类的实例来重写(override)这类函数。

C++中静态绑定的例子:

class Base {
public:
    void Show() { /* ... */ }
};

class Derived : public Base {
public:
    void Show() { /* ... */ }
};

int main() {
    Derived obj;
    obj.Show(); // 静态绑定,将调用 Derived::Show()
    return 0;
}

在这个例子中,尽管Derived类覆盖了Show()方法,但由于它不是虚拟函数,因此选择哪个版本的函数是由编译器在编译时刻决定的。


动态绑定(Dynamic Binding)

动态绑定,又称为晚期绑定,是在运行时完成的函数调用解析过程。当一个函数调用关联到一个虚函数时,具体将调用哪个函数版本将待到程序运行时根据对象的实际类型来确定。这使得程序能够动态地根据对象的实际类型调用适当的函数版本,也是多态性的基础。

在C++中,动态绑定是通过使用虚函数和继承实现的。当派生类重写了基类的虚函数时,通过基类指针或引用调用这个虚函数将会根据对象的实际类型来解析。

C++中动态绑定的例子:

class Base {
public:
    virtual void Show() { /* ... */ }
};

class Derived : public Base {
public:
    void Show() override { /* ... */ }
};

int main() {
    Base* bPtr = new Derived();
    bPtr->Show(); // 动态绑定,将调用 Derived::Show()
    delete bPtr;
    return 0;
}

在这个例子中,Show()方法被声明为virtual,因此通过bPtr(即使它是Base类型的指针)调用Show()时,如果bPtr实际指向Derived类的对象,则会调用Derived类的Show()实现。这个决定发生在运行时。

总结

  • 静态绑定在编译时决定了方法调用的目标。由于不需要在运行时进行额外的决策,所以它通常具有更好的性能。
  • 动态绑定在运行时确定方法调用的目标,为多态提供了必要的机制,但这可能会带来一些性能开销(比如通过虚函数表查找)。

标签:调用,函数,Show,静态,绑定,Derived,动态
From: https://blog.51cto.com/u_15958702/9184920

相关文章

  • Helix QAC—软件静态测试工具
    产品概述    HelixQAC是Perforce公司(原PRQA公司)产品,主要用于C/C++代码的自动化静态分析工作,可以提供编码规则以及信息安全相关检查、代码质量度量、软件结构分析、测试结果管理等功能。HelixQAC能够准确地发现软件中潜在的问题,自身符合ISO26262功能安全标准认证。适用于......
  • 轻量化动态编译库 Natasha v8.0 正式发布!
    .NET8.0与动态编译Hello各位小伙伴,我于2024年1月10日发布了Natasha一个全新的里程碑版本v8.0,对于老用户而言,此次发布版本号跨度较大,是因为我决定使用新的版本号计划,主版本号将随Runtime版本号的增加而增加。浅谈.NET8.0在.NET8.0Runtime方向的深度解析文章出来......
  • 静态vxlan隧道实验
    1、实验拓扑图2、实验目的PC1通过vxlan隧道与PC2通信3、实验配置LEAF1:[leaf1]displaycurrent-configuration !SoftwareVersionV200R005C10SPC607B607!Lastconfigurationwasupdatedat2024-01-1011:11:18+00:00#sysnameleaf1#deviceboard17board-typeCE-MPUBd......
  • Next.js 开发指南 路由篇 | 动态路由、路由组、平行路由和拦截路由
     前言实际项目开发的时候,有的路由场景会比较复杂,比如数据库里的文章有很多,我们不可能一一去定义路由,此时该怎么办?组织代码的时候,有的路由是用于移动端,有的路由是用于PC端,该如何组织?如何有条件的渲染页面,比如未授权的时候显示登录框?如何让同一个路由根据情况不同展示不同的内......
  • 配置CentOS系统以支持静态HTTP服务
    CentOS是一个流行的Linux发行版,广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务,您可以按照以下步骤进行操作:1. 安装Web服务器软件:CentOS自带了ApacheHTTP服务器软件,您可以使用以下命令安装它:2. 复制代码sudoyuminstallhttpd1. 启动Web服务器:安装完成后,您需要启动......
  • 博客趣个人静态网页模板代码
    这是一款适用于博客、新闻、公司、图片、小说、文档、商城、资源下载、网址导航等多种类型网站的博客趣网页模板。模板具有最小和清洁的设计,易于使用,并具有有趣的功能。bokequ主题简约干净的设计、在明暗风格之间进行现场切换。1、主页html代码<!doctypehtml><html><hea......
  • 平台工程动态 Monthly News 2023-12
    TOC项目与社区动态CNOE:云原生卓越运营领英工程团队开源了其开发者生产力与幸福感框架Backstage添加中文README会议与活动PlatformCon2024议题正在征集中KubeConEU2023回顾KubeConNA回顾TOP100全球软件案例研究峰会优质好文推荐微软推出平台工程学习课程......
  • 平台工程动态 Monthly News 2023-11
    本期内容导览项目与社区动态CNCF云原生技术全景图v22023平台工程调研报告CNCFAppDeliveryTAG发布中文网站CNCF平台工程成熟度模型发布Humanitec发布平台工程现状报告Gartner:中国的平台工程正处于萌芽期CNCFPaaP工作组正在起草「平台即产品」白皮书HashiCo......
  • C-学生管理系统动态版
    DT_student.h#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<string.h>#include<stdlib.h>//#defineMAX1000#defineMAX_NUM4#defineMAX_NAME20#defineMAX_AGE4#defineMAX_SEX5#defineMAX_ADDR10#defineDEFAULT_CAP......
  • 动态代理和静态代理
    先说一下代理模式的好处:隐藏真实对象的复杂性:Java 代理模式可以隐藏真实对象的复杂性,客户端只需要与代理对象交互即可,不需要了解真实对象的复杂实现细节,从而简化了客户端的代码实现和维护。增强真实对象的功能和可靠性:Java 代理对象可以在访问真实对象之前或之后执行一些额外......