您的位置:首页 > 编程语言 > C语言/C++

C++ 多态 polymorphic 编译时期多态

2016-06-19 14:12 260 查看
C++面试官必问的一个问题

简单的来说,多态就是 一个函数 有多种实现。

多态里面最关键的一个问题就是,实际调用的时候到底调用的是哪一个具体的实现!

依据 这个函数最后被确定下来的时期 分为编译时期多态 和 运行时期多态

下面对这两种做一下简单的介绍

多态可以分为编译时期多态运行时期多态

[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)的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: