户眼中的C++类(续) 如果是 Borland o+编译器(402) @CMy String@ SbctrSqpxc @CMy String@ Sbdtr Sqv @CMy String@ FindSqpxc @CMy String(@LengthSqy 冷问题1:名字冲突
客户眼中的C++类(续) !如果是Borland C++ Borland C++编译器(4.02) @CMyString@$bctr$qpxc @CMyString@$bdtr$qv @CMyString@Find$qpxc @CMyString@Length$qv !问题1:名字冲突
命名冲突解决方案1 模块定义文件(de声给出别名 LIBRARY MYSTRING EXPORTS @CMy Stringl@ Sbctr Sqpxc=??0CMy String@@QAE@@Z @CMy String @Sbdtr Sqv=?? 1 CMy String@@QAE@XZ @CMy String(@ FindSqpxc=? Find@ CMy String@@QAEPBDPBD@Z @CMy String@LengthSqv=?Length CMy String@@QAEHXZ
命名冲突解决方案 命名冲突解决方案 1 !模块定义文件(.def)中给出别名 LIBRARY MYSTRING EXPORTS @CMyString@$bctr$qpxc=??0CMyString@@QAE@PBD@Z @CMyString@$bdtr$qv=??1CMyString@@QAE@XZ @CMyString@Find$qpxc=?Find@CMyString@@QAEPBDPBD@Z @CMyString@Length$qv=?Length@CMyString@@QAEHXZ
命名冲突解决方案2 模块定义文件(e给出序号别名 LIBRARY MYSTRING EXPORTS .?0CMyStringaaQAEaPBDaz al ? 1CMy String@@QAE@XZ @2 ? Find @CMy String@@QAEPBDPBD@Z @3 ?Length@CMy String@@QAEHXZ 4 LIBRARY MYSTRING EXPORTS @CMy String@ Sbctr Sqpxc @CMy String@ Sbdtr Sqy a2 @CMy String(@ FindSqpxc ⑦3 @CMy String(@Length Sqv @4
命名冲突解决方案 命名冲突解决方案 2 !模块定义文件(.def)中给出序号别名 中给出序号别名 LIBRARY MYSTRING EXPORTS ??0CMyString@@QAE@PBD@Z @1 ??1CMyString@@QAE@XZ @2 ?Find@CMyString@@QAEPBDPBD@Z @3 ?Length@CMyString@@QAEHXZ @4 LIBRARY MYSTRING EXPORTS @CMyString@$bctr$qpxc @1 @CMyString@$bdtr$qv @2 @CMyString@Find$qpxc @3 @CMyString@Length$qv @4
命名冲突解决方案3 使用C++类的abe C++类的Vtbe不随编译器而变化 vtable包含了各个函数的原型,顺序固 定,每个函数的参数、返回类型等,函 数名并不重要 Vabe要求这些接口函数必须是虚函数 客户如何得到 vtable? 仍然需要有一种办法来创建C++类 new/ delete?需要对象的二进制结构- 可题2
命名冲突解决方案 命名冲突解决方案 3 !使用C++类的vtable !C++类的vtable不随编译器而变化 不随编译器而变化 !vtable包含了各个函数的原型,顺序固 包含了各个函数的原型,顺序固 定,每个函数的参数、返回类型等,函 定,每个函数的参数、返回类型等,函 数名并不重要 !vtable要求这些接口函数必须是虚函数 要求这些接口函数必须是虚函数 !客户如何得到vtable ? – 仍然需要有一种办法来创建 仍然需要有一种办法来创建C++ 类 – new/delete new/delete ?需要对象的二进制结构 需要对象的二进制结构—— 问题 2
c对的二进制结构 C++的封装是语法上的封装,而不是二 进制封装 new/ delete是编译器相关的 编译器不仅要知道 public信息,也要知道 private信息 C++对象的二进制结构是编译器相关的 即使客户看到的C++类公开接口没有变 化,但是C++类的实现改变了,仍然会 打破客户与对象之间的连接
C++对象的二进制结构 对象的二进制结构 !C++的封装是语法上的封装,而不是二 的封装是语法上的封装,而不是二 进制封装 !new/delete new/delete是编译器相关的 是编译器相关的 – 编译器不仅要知道public信息,也要知道 private private信息 !C++对象的二进制结构是编译器相关的 对象的二进制结构是编译器相关的 !即使客户看到的C++类公开接口没有变 化,但是C++类的实现改变了,仍然会 打破客户与对象之间的 客户与对象之间的连接