首页 > 编程语言 >理解 C++ 中的对象类型与绑定机制:静态绑定 vs 动态绑定

理解 C++ 中的对象类型与绑定机制:静态绑定 vs 动态绑定

时间:2024-06-18 17:01:05浏览次数:15  
标签:静态 staticFunc 绑定 C++ 对象 vs 动态 ptr

静态绑定和动态绑定

概念解释
  1. 对象的静态类型

    • 对象在声明时采用的类型,在编译期确定,无法更改。
  2. 对象的动态类型

    • 对象在运行期实际表现的类型,在运行期决定,对象的动态类型可以更改(通过多态和指针/引用的方式)。
  3. 静态绑定

    • 绑定的是对象的静态类型,某特性(比如函数调用)依赖于对象的静态类型,发生在编译期。
  4. 动态绑定

    • 绑定的是对象的动态类型,某特性(比如函数调用)依赖于对象的动态类型,发生在运行期。通常通过虚函数实现。

代码示例

下面的代码示例展示了静态绑定和动态绑定的区别。

#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;
}

解释

  1. 静态绑定

    • staticFunc 是一个非虚函数,因此它被静态绑定。即在编译期,函数调用被解析为基类的 staticFunc,无论指针指向的是 Base 还是 Derived 对象。
    • 当调用 ptr->staticFunc() 时,虽然 ptr 指向不同的对象(Base 和 Derived),但输出的都是基类的 staticFunc
  2. 动态绑定

    • dynamicFunc 是一个虚函数,因此它被动态绑定。在运行期,函数调用根据对象的动态类型进行解析。
    • 当调用 ptr->dynamicFunc() 时,函数调用根据对象的动态类型决定。如果 ptr 指向 Base 对象,调用基类的 dynamicFunc;如果 ptr 指向 Derived 对象,调用派生类的 dynamicFunc
总结
  • 静态类型 在编译期确定,无法更改;静态绑定依赖于对象的静态类型,函数调用在编译期解析。
  • 动态类型 在运行期决定,可以更改;动态绑定依赖于对象的动态类型,函数调用在运行期解析。

希望这些解释和示例能帮助你更好地理解静态绑定和动态绑定的概念。

标签:静态,staticFunc,绑定,C++,对象,vs,动态,ptr
From: https://blog.csdn.net/m0_72877724/article/details/139755375

相关文章

  • Ubuntu 使用Vscode的一些技巧 ROS
    UbuntuVSCode的一些设置(ROS)导入工作空间推荐只导入工作空间下的src目录如果将整个工作空间导入VSCode,那么这个src就变成了次级目录,容易在写程序的时候把本应该添加到具体工程src目录里的代码文件给误添加到这个catkin_ws下这个src目录里Ctrl+Shift+B快捷编译设置......
  • 《C++ Primer》导学系列:第 5 章 - 语句
    5.1简单语句5.1.1基本概念在C++中,简单语句是构成程序的基本单元。每个简单语句以分号(;)结束,可以是表达式、声明或空语句。5.1.2表达式语句表达式语句是由表达式构成的语句,通常用于计算、赋值和函数调用。示例代码#include<iostream>intmain(){inta=10;......
  • c++期末题库三(读程序写结果)
    1.#include<iostream>usingnamespacestd;classBC{public:BC(intn=100){val=n;cout<<"defaultcon."<<endl;}BC(BC&t){val=t.val;cout<<"Copycon."<<endl;}BC&operator=(BC&t){val=t.val;c......
  • VC++ gen uuid and time
    //ConsoleApplication2.cpp:Thisfilecontainsthe'main'function.Programexecutionbeginsandendsthere.//#define_CRT_SECURE_NO_WARNINGS#pragmacomment(lib,"rpcrt4.lib")#include<windows.h>#include<rpcdce.h>#......
  • NPOI给模板绑定下拉项
    1、.xlsx后缀模板使用NPOI版本【v2.7.0】usingNPOI.HSSF.UserModel;usingNPOI.SS.UserModel;usingNPOI.SS.Util;usingNPOI.XSSF.UserModel;///<summary>///模板初始化///</summary>publicvoidTemplateInit(){str......
  • C/C++ main 函数注意事项
    main 函数是C/C++程序的入口点,当运行程序时,操作系统会调用 main 函数来启动程序。下面为 main 函数的注意事项:函数签名:在C/C++中,main 函数的标准签名通常有两种形式:intmain(){//...}intmain(intargc,char*argv[]){//...}其中,argc 是命......
  • C++ 20新特性之原子引用
    ......
  • 【C/C++】实现高性能日志轮转功能,已实测
    基本实现在C语言中实现日志文件轮转功能,你需要手动编写代码来处理文件的重命名、压缩和删除。下面是一个简单的C语言程序示例,它演示了如何实现基本的日志文件轮转功能。这个程序会检查日志文件的大小,如果超过预设的大小限制,则将当前日志文件重命名,并创建一个新的日志文件。......
  • LeetCode 算法: 环形链表 c++
    原题链接......
  • C++的动态内存管理
    C++的new和delete一、C与C++的内存管理以及分配二、C++中的new和delete1、new/new[]和delete/delete[]的用法2、new和delete对于内置类型和自定义类型的区别三、new和delete的底层原理1、全局的operatornew和全局的operatordelete2、对于内置类型和自定义类型两个全局......