当前位置: 首页 > news >正文

C++编译与运行:其二、编译期和运行期的区别

C++的编译分为四步,最终生成一个可执行文件。
C++的运行,就是将可执行文件交给操作系统,按照机器码逐步执行,运行功能。
先看一个非常非常有趣的例子:

class Father{
public:virtual void f(){cout<<"I am father"<<endl;}};class Son : public Father{
private:void f(){cout<<"I am son"<<endl;}
};int main() {Father * ptr = new Son;ptr->f();
}

看起来是不被允许的访问私有成员。但是不仅可以编译通过,而且输出的还是

I am son

看起来非常非常的难以理解。
首先,类是编译期间的概念,所谓访问权限控制只发生在编译期间。对象分配内存才是运行期间概念。
Father * ptr = new Son;
ptr是动态类型,因为存在虚函数和虚函数表,所以变成了动态绑定。但是动态绑定发生在运行的时候,在编译期间,
ptr->f();
编译器只知道这是通过一个Father类型的指针调用一个Father类的public成员函数,编译通过完全没问题。
因为虚函数表的产生,所以运行时实际调用的是Son类的私有成员函数,但是运行时不关注访问类型,如此一来毫无问题。

我想通过这个例子说明什么呢?
代码中如果调用非虚函数,那么在编译期间就已经明确了行为;
代码中如果调用了虚函数,那么在运行期间才会明确行为。

http://www.lryc.cn/news/209585.html

相关文章:

  • 汽车电子专有名词与相应技术
  • idea 没加载 provided的包
  • Hover:借贷新势力崛起,在经验与创新中找寻平衡
  • 软件设计原则-依赖倒置原则讲解以及代码示例
  • Linux--进程替换
  • 【计算机网络】TCP协议
  • 机器学习数据集:Kaggle
  • 软考 系统架构设计师系列知识点之设计模式(4)
  • PyCharm 安装 cx_Oracle 失败
  • 解决Windows出现找不到mfcm90u.dll无法打开软件程序的方法
  • 如何设计线程安全的 HashMap?
  • rpc汇总
  • OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)
  • 指针仪表读数YOLOV8NANO
  • 10000字!图解机器学习特征工程
  • Java 官方提供了哪几种线程池,分别有什么特点?
  • DTI-ALPS处理笔记
  • LVS集群-NAT模式
  • 微服务技术导学
  • p5.js 开发点彩画派的绘画工具
  • Java工具库——Commons IO的50个常用方法
  • Git: 仓库clone和用户配置
  • 构建外卖小程序:技术要点和实际代码
  • ubuntu安装配置svn
  • 『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程
  • Unity C#中LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查
  • Spring常见面试题
  • 通过Vue自带服务器实现Ajax请求跨域(vue-cli)
  • Vue2-计算属性的用法
  • SM3加密udf