我一直在阅读"姓名解析"在维基百科(Name resolution WIKI)中,已经给出了C ++使用"静态名称解析"。如果这是真的那么我就无法弄清楚C ++如何设法提供"多态性"不使用动态名称解析。
任何人都可以回答C ++是否使用"静态名称解析"或"动态名称解析"。如果它是静态的,你还可以解释C ++如何提供多态性。
答案 0 :(得分:7)
维基百科对名称解析的定义是关于如何将标记解析为构造的名称(函数,类型名等)。鉴于该定义,C ++具有100% static 及其名称解析。表示标识符的每个标记必须在编译时与特定实体相关联。
C ++多态性实际上是在欺骗。编译器可以看到静态名称解析为使用virtual
关键字定义的成员函数。如果编译器发现您正在调用此对象的对象是动态对象(即:指向该类型的指针/引用而不是该类型的值),则编译器会发出特殊代码来调用该函数。
此特殊代码不会更改其解析的名称。它改变的是最终被调用的函数。那不是动态命名;这是动态函数 dispatch 。名称在编译时解析;该函数在运行时得到解决。
答案 1 :(得分:0)
C ++使用静态名称解析,因为它重命名每个函数,使每个函数都具有唯一性
这意味着编译器将函数int foo(int bar)
称为_Z3fooi
,而int foo(float bar)
将被称为_Z3foof
。
这就是我们所说的name mangling。