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

来源:互联网 发布:帝国cms标签工具 编辑:程序博客网 时间:2024/05/21 15:23

C++面试官必问的一个问题

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

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

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


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


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


编译时期多态 在编译的时候就能够确定被调用的函数

同名函数,根据参数的个数或者参数类型的不同实现的多态

最常见的例子,就是构造函数的多态了,如下所示,

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)的目的。








0 0
原创粉丝点击