面向对象程序设计-10-11讲.ppt

  1. 1、本文档共66页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * void fun(Base *b) { //得到表示b和*b类型信息的对象 const type_info info1 = typeid(b); const type_info info2 = typeid(*b); cout typeid(b): info1.name() endl; cout typeid(*b): info2.name() endl; if (info2 == typeid(Base)) //判断*b是否为Base类型 cout A base class! endl; } int main() { Base b; fun(b); Derived d; fun(d); return 0; } 运行结果: typeid(b): class Base * typeid(*b): class Base A base class! typeid(b): class Base * typeid(*b): class Derived * 虚函数动态绑定的实现原理 动态选择被执行的函数 函数的调用,需要通过函数代码的入口地址 把函数入口地址作为变量,在不同情况下赋予不同的值,通过该变量调用函数,就可动态选择被执行的函数 回顾:第6章介绍的函数指针、指向成员函数的指针 虚表 每个多态类有一个虚表(virtual table) 虚表中有当前类的各个虚函数的入口地址 每个对象有一个指向当前类的虚表的指针(虚指针vptr) 动态绑定的实现 构造函数中为对象的虚指针赋值 通过多态类型的指针或引用调用成员函数时,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址 通过该入口地址调用虚函数 * 深 度 探 索 * 指向f()的指针 指向g()的指针 Base的虚表 指向f()的指针 指向g()的指针 指向h()的指针 Derived的虚表 (Base::f的代码) push %ebp mov %esp,%ebp …… (Base::g的代码) push %ebp mov %esp,%ebp …… (Derived::f的代码) push %ebp mov %esp,%ebp …… (Derived::h的代码) push %ebp mov %esp,%ebp …… i vptr i vptr j Base类型对象 Derived类型对象 class Base { public: virtual void f(); virtual void g(); private: int i; }; class Derived: public Base { public: virtual void f(); //覆盖Base::f virtual void h(); //新增的虚函数 private: int j; }; 深 度 探 索 * 模板 函数模板 类模板 * 函数模板 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 定义方法: template 模板参数表 函数定义 模板参数表的内容 类型参数:class(或typename) 标识符 常量参数:类型说明符 标识符 模板参数:template 参数表 class 标识符 函 数 模 板 * 求绝对值函数的模板 #include iostream using namespace std; templatetypename T T abs(T x) { return x 0? -x : x; } int main() { int n = -5; double d = -5.5; cout abs(n) endl; cout abs(d) endl; return 0; } 函 数 模 板 运行结果: 5 5.5 * 求绝对值函数的模板分析 编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数: int abs(int x) { return x 0 ? –x : x; } 函 数 模 板 * 类模板的作用 使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。 类 模 板

文档评论(0)

2232文档 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档