IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 中的静态绑定和动态绑定 -> 正文阅读

[C++知识库]C++ 中的静态绑定和动态绑定

C++ 在面向对象编程中,有着静态绑定动态绑定的定义,为了了解这两个概念,首先先简单阐述一些名词:

  • 静态类型:对象在声明时使用的类型,在编译期就已经确定
  • 动态类型:指针变量或引用变量所指向对象的类型,在运行期才能确定
  • 静态绑定:绑定的是静态类型,对象的函数和属性依赖于绑定的静态类型,发生在编译期
  • 动态绑定:绑定的是动态类型,对象的函数和属性依赖于绑定的动态类型,发生在运行期

而非虚函数一般都是静态绑定,虚函数则是动态绑定

举一个例子来说明静态类型和动态类型:

class Shape {//用于描述几何形状的类
public:
    enum ShapeColor  { Red, Green, Blue };
    //所有形状都必须提供一个函数来绘制自己
    virtual void draw(ShapeColor color = Red) const = 0;
	void draw() const;
    ...
};
class Rectangle : public Shape {
public: 
    //注意,与基类的默认参数值不同
    virtual void draw(ShapeColor color = Green) const;
    ...
};
class Circle : public Shape  {
public:
    //没有默认参数值,调用该函数一定要赋予参数,因为静态绑定下,这个函数并不从其基类继承默认参数值
    //但若以指针或引用调用此函数,可以不指定参数值,因为动态绑定下,这个函数会从其基类继承默认参数值
    virtual void draw(ShapeColor color) const;
    ...
};

int main(){
	// 静态类型都为 Shape* 。注意,不论它们真正指向什么,它们的静态类型都是 Shape*
	Shape* ps;					// ps 没有指向,所以它没有动态类型
	Shape* pNull = nullptr;		// pNull 没有指向,所以它没有动态类型
	Shape* pc = new Circle;		// pc 的动态类型为 Circle*
	Shape* pr = new Rectangle;	// pr 的动态类型为 Rectangle*
	ps = pc;					// ps 的动态类型如今是 Circle*
	ps = pr;					// ps 的动态类型如今是 Rectangle*
	
	return 0;
}

由于 虚函数 是动态绑定的,所以调用一个 虚函数 时,究竟调用哪个函数取决于发出调用的那个对象的 动态类型

pc->draw(Shape::Red);	// 调用 Circle::draw(Shape::Red)
pr->draw(Shape::Red);	// 调用 Rectangle::draw(Shape::Red)
pNull->drwa();			// 调用 Shape::draw() ,空指针可以调用非虚函数,因为静态绑定在编译期就确定了,和指针空不空没关系

总结一下静态绑定和动态绑定的区别:

  1. 静态绑定发生在编译期,动态绑定发生在运行期
  2. 对象的动态类型可以更改,但是静态类型无法更改
  3. 要想实现动态,必须使用动态绑定
  4. 在继承体系中只有虚函数使用的是动态绑定,其他的全部是静态绑定;
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:02:42  更:2022-07-17 16:07:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 8:52:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码