多态(静态、动态、函数、宏)
来源:互联网 发布:windows搜索索引 编辑:程序博客网 时间:2024/06/11 23:19
静态多态
静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数。对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系,必须存在必需的同名成员函数。
优点:
1、由于静多态是在编译期完成的,因此效率较高,编译器也可以进行优化;
2、静态多态通过模板编程为C++带来了泛型设计的概念,比如强大的STL库。
缺点:
由于是模板来实现静态多态,因此模板的不足也就是静多态的劣势,比如调试困难、编译耗时、代码膨胀、编译器支持的兼容性。
//静态多态class Fly{public: void fly() = 0;};class Duck :public Fly{public: void fly() { cout << "duck can't fly" << endl; }};class Chicken :public Fly{public: void fly() { cout << "chicken can't fly" << endl; }};void _fly(Fly& f){ f.fly();}void test2(){ Duck d; Chicken c; _fly(d); _fly(c);}
动态多态
动态多态则是利用虚函数和继承机制实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会调哪个函数。
虚函数 就是在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指向基类对象的指针,然后使该指针指向由该基类派生的子类对象,再然后用这个指针来调用改虚函数,就能实现动态多态。
缺点:
编译器不可对虚函数进行优化。
//动态多态class Fly{public: virtual void fly() = 0;};class Duck :public Fly{public: virtual void fly() { cout << "duck can't fly" << endl; }};class Chicken :public Fly{public: virtual void fly() { cout << "chicken can't fly" << endl; }};void _fly(Fly* f){ f->fly();}void test1(){ Duck d; Chicken c; _fly(&d); _fly(&c);}
静态多态与动态多态的比较
不同点:
1、本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;
2、动态多态中接口是显式的,通过虚函数在运行期实现,静态多态中接口是隐式的,通过模板具现在编译期完成。
相同点:
1、都能够实现多态性,静态多态/编译期多态、动态多态/运行期多态;
2、都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现;
函数多态
即重载,基于不同的函数参数列表,相同名称的函数可以指向不同的函数定义。
//函数多态int _add(int a, int b){ return a + b;}int _add(int a, string b){ return a + atoi(b.c_str());}void test4(){ int ret1 = _add(3, 7); int ret2 = _add(2, "a"); cout << "ret1=" << ret1 << endl; cout << "ret2=" << ret2 << endl;}
宏多态
带变量的宏实现的初级形式的静态多态。
//宏多态void test3(){ int n1 = 10; int n2 = 20; string str1 = "hello"; string str2 = "world"; int ret1 = ADD(n1, n2); string ret2 = ADD(str1,str2); cout << "n1+n2=" << ret1 << endl; cout << "str1+str2=" << ret2 << endl;}
- 多态(静态、动态、函数、宏)
- C++ 多态 虚函数 纯虚函数 动态、静态转换
- virtual函数中的动态、静态绑定
- 虚函数,静态与动态绑定
- 静态、动态、命令、函数式编程语言。。。
- c++ 纯虚函数+动态、静态关联
- 静态联编和动态联编虚函数
- 静态与动态RNN函数比较
- 静态变量VS动态变量(自动变量) 静态存储VS动态存储 静态库VS动态库 静态函数(又称内部函数)VS外部函数
- c++中静态函数与动态函数的区别
- 静态函数与动态函数之间的相互访问
- 虚函数学习(静态联编,动态联编,多态,构造,虚析构,delete)
- 多态(1)静态多态与动态多态以及虚函数相关
- 面向对象技术,多态,重载,静态联编与动态连编,虚函数,抽象类,虚析构函数
- 面向对象技术,多态,重载,静态联编与动态连编,虚函数,抽象类,虚析构函数
- 关于基类、派生类、对象、指针和虚函数、多态、 静态绑定、 动态绑定 纯虚函数、抽象类
- Java面向对象 多态动态绑定(非静态成员函数、成员变量、静态成员函数)
- Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
- c++对c的优化
- 可自定义数组元素个数的数组类的设计
- python:progressbar
- 57条最有价值的经验
- 从高考到程序员---一个五年程序员的回忆及建议
- 多态(静态、动态、函数、宏)
- 关公麻将游戏技术支持
- thinkphp 分页
- Android 线程简介
- 配置环境并打印HelloWorld
- 素数,杭电蓝桥杯模拟测试
- 《FreeSWITCH: VoIP实战》:SIP 模块
- design patterns
- 史上最全最强SpringMVC详细分享