C++ 多态 polymorphic 编译时期多态
2016-06-19 14:12
260 查看
C++面试官必问的一个问题
简单的来说,多态就是 一个函数 有多种实现。
多态里面最关键的一个问题就是,实际调用的时候到底调用的是哪一个具体的实现!
依据 这个函数最后被确定下来的时期 分为编译时期多态 和 运行时期多态
下面对这两种做一下简单的介绍
多态可以分为编译时期多态和运行时期多态
[b]编译时期多态 在编译的时候就能够确定被调用的函数[/b]
同名函数,根据参数的个数或者参数类型的不同实现的多态
最常见的例子,就是构造函数的多态了,如下所示,
那么调用的时候,调用的到底是哪一个构造函数呢?其实编译器对函数进行了重命名,加上了参数类型,
首先使用 g++ -g test.app
然后使用 strings - a.out | grep Test 搜索二进制文件中的可见字符
__ZN4TestC1Ev //Test()
__ZN4TestC1Ei //Test(int x)
__ZN4TestC1Ec //Test(char x)
__ZN4TestC1Eff //Test(float x, float y)
__ZN4TestC1Exx //Test(long long x, long long y)
__ZN4TestC1Eiiiiii //Test(int x, int y, int z, int a, int b, int c)
note: 所以的函数被调用之后符号表里才能找得到哦! 否则以上的函数符号是找不到的!
那么当你写Test(4.54f, 45f),编译器一看你传了两个float,就直接把这句翻译成了__ZN4TestC1Eff,从而实现调用Test(float x, float y)的目的。
简单的来说,多态就是 一个函数 有多种实现。
多态里面最关键的一个问题就是,实际调用的时候到底调用的是哪一个具体的实现!
依据 这个函数最后被确定下来的时期 分为编译时期多态 和 运行时期多态
下面对这两种做一下简单的介绍
多态可以分为编译时期多态和运行时期多态
[b]编译时期多态 在编译的时候就能够确定被调用的函数[/b]
同名函数,根据参数的个数或者参数类型的不同实现的多态
最常见的例子,就是构造函数的多态了,如下所示,
class Test{ public: Test(){ cout<<"This is Test()"<<endl; } Test(int x){ cout<<"This is Test(int x)"<<endl; } Test(int x, int y, int z, int a, int b, int c){ cout<<"This is Test(int x)"<<endl; } Test(char x){ cout<<"This is Test(char x)"<<endl; } Test(float x, float y){ cout<<"This is Test(char x)"<<endl; } Test(long long x, long long y){ cout<<"This is Test(char x)"<<endl; } };
那么调用的时候,调用的到底是哪一个构造函数呢?其实编译器对函数进行了重命名,加上了参数类型,
首先使用 g++ -g test.app
然后使用 strings - a.out | grep Test 搜索二进制文件中的可见字符
__ZN4TestC1Ev //Test()
__ZN4TestC1Ei //Test(int x)
__ZN4TestC1Ec //Test(char x)
__ZN4TestC1Eff //Test(float x, float y)
__ZN4TestC1Exx //Test(long long x, long long y)
__ZN4TestC1Eiiiiii //Test(int x, int y, int z, int a, int b, int c)
note: 所以的函数被调用之后符号表里才能找得到哦! 否则以上的函数符号是找不到的!
那么当你写Test(4.54f, 45f),编译器一看你传了两个float,就直接把这句翻译成了__ZN4TestC1Eff,从而实现调用Test(float x, float y)的目的。
相关文章推荐
- C语言-位运算的应用
- C++课程小结 继承与派生
- 山东省第七届ACM大学生程序设计竞赛-Execution of Paladin(炉石传说-模拟)
- JNI之C语言(七)-- 其他
- 详细解析C语言中的sizeof
- JNI之C语言(六)-- 数组
- JNI之C语言(五)-- 指针
- JNI之C语言(四)-- 函数
- 两则C语言技巧
- JNI之C语言(三)-- 基本语法
- JNI之C语言(二)-- 基本类型
- JNI之C语言(一)--快速入门
- C语言中生产随机数 rand()函数
- C++的三大特性之一继承
- 第16周项目1--小玩文件(2)
- C++读写文件的简单例子
- leetcode_c++:Move Zeroes(283)
- 第16周项目1--小玩文件(1)
- leetcode_c++:Missing Number(268)
- 山东省第七届ACM大学生程序设计竞赛-Reversed Words