C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计
“ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 多态的概念 运行时多态 模板 重载与静态联编 覆盖与静态联编 虚函数与动态联编 函数模板 运行时多态 C++语言程序设计
刨根问底 c C++语言程序设计
函数重载:编译器根据函数的参数能够确定每次调用哪个函数 (I) 重载与静态联编 函数重载:编译器根据函数的参数能够确定每次调用哪个函数 int add(int a){ return a+10;} int add(int a,int b){ return a+b;} int main(){ int x=1,y=2; add(x); add(x,y); return 0; } 经过编译器处理之后,同名的函数变成了不同地址的子程序 对同名函数的调用变成了对不同地址子程序的调用 这个转变过程是由编译器完成的 编译器分辨出了同名函数的不同之处。 属于静态联编 C++语言程序设计
(II) 覆盖与静态联编 函数覆盖: 被派生类覆盖的函数是否是虚函数: 只出现在继承树中 在派生类中定义和基类中同名的成员函数,是对基类进行改造,为派生类增加新行为的一种常用的方法。 通过不同的派生类的对象(对象指针或者对象引用),调用这些同名的成员函数,实现不同的操作,也是多态性的一种表现。 被派生类覆盖的函数是否是虚函数: 是虚函数——动态联编 不是虚函数——静态联编 C++语言程序设计
(II) 覆盖与静态联编 class B { public: f(){…}}; class P: public B { public: f(){…}}; class Q: public B { public: f(){…}}; main () { P p; Q q; B * pb; p.f(); q.f(); pb=&p; pb->f(); pb=&q; } class B { public: virtual f(){…}}; C++语言程序设计
(III) 虚函数与动态联编 分析程序是否有错: C++语言程序设计 #include <iostream> using namespace std; class B { public: virtual void vf1(){cout<<"B::vf1被调用"<<endl;} virtual void vf2(){cout<<"B::vf2被调用"<<endl;} void f(){cout<<"B::f被调用"<<endl;} }; class D:public B { virtual void vf1(){cout<<"D::vf1被调用"<<endl;} void vf2(int i){cout<<i<<endl;} void f(){cout<<"D::f被调用"<<endl;} int main() { D d; B *bp=&d; bp->vf1(); bp->vf2(); bp->vf2(10); bp->f(); return 0; } 有编译错误 C++语言程序设计
(III) 虚函数与动态联编 动态联编的缺点: 虚函数在程序执行过程中来判断执行哪个函数,会引入较大的开销。 可以说,C ++ 程序的执行效率低于C程序主要体现在C ++ 引入了虚函数和虚基类。 如果极度关注C ++ 程序的性能(例如编写工业用实时控制程序),那么在优化C ++ 程序的同时,应尽量避免使用虚函数和虚基类。 C++语言程序设计