C++ 使用静态名称解析还是动态名称解析?
Does C++ use static name resolution or dynamic name resolution?
我一直在维基百科 (Name resolution WIKI) 中阅读有关 "Name resolution" 的内容,并且已经给出了 C++ 使用 "Static Name Resolution" 的信息。如果这是真的,那么我无法弄清楚 C++ 如何在不使用动态名称解析的情况下设法提供 "polymorphism"。
任何人都可以回答 C++ 使用 "Static Name Resolution" 还是 "Dynamic Name Resolution"。如果是静态的,能不能也解释一下C++是如何提供多态性的。
C++ 使用静态名称解析,因为它重命名每个函数,使每个函数都具有唯一性。
这意味着函数 int foo(int bar)
将被编译器称为 _Z3fooi
,而 int foo(float bar)
将被编译器称为 _Z3foof
.
这就是我们所说的name mangling.
维基百科对名称解析的定义是关于如何将标记解析为结构名称(函数、类型名称等)。根据该定义,C++ 的名称解析是 100% static。表示标识符的每个标记都必须在编译时与特定实体相关联。
C++ 多态性实际上是作弊。编译器可以看到静态名称解析为使用 virtual
关键字定义的成员函数。如果编译器发现你调用它的对象是一个动态对象(即:一个 pointer/reference 到那个类型而不是那个类型的值),编译器发出特殊代码来调用那个函数。
此特殊代码不会更改它解析为的 名称。它改变的是最终被调用的函数。那不是动态命名;那是动态函数 dispatch。该名称在编译时得到解析;该函数在运行时得到解析。
我一直在维基百科 (Name resolution WIKI) 中阅读有关 "Name resolution" 的内容,并且已经给出了 C++ 使用 "Static Name Resolution" 的信息。如果这是真的,那么我无法弄清楚 C++ 如何在不使用动态名称解析的情况下设法提供 "polymorphism"。
任何人都可以回答 C++ 使用 "Static Name Resolution" 还是 "Dynamic Name Resolution"。如果是静态的,能不能也解释一下C++是如何提供多态性的。
C++ 使用静态名称解析,因为它重命名每个函数,使每个函数都具有唯一性。
这意味着函数 int foo(int bar)
将被编译器称为 _Z3fooi
,而 int foo(float bar)
将被编译器称为 _Z3foof
.
这就是我们所说的name mangling.
维基百科对名称解析的定义是关于如何将标记解析为结构名称(函数、类型名称等)。根据该定义,C++ 的名称解析是 100% static。表示标识符的每个标记都必须在编译时与特定实体相关联。
C++ 多态性实际上是作弊。编译器可以看到静态名称解析为使用 virtual
关键字定义的成员函数。如果编译器发现你调用它的对象是一个动态对象(即:一个 pointer/reference 到那个类型而不是那个类型的值),编译器发出特殊代码来调用那个函数。
此特殊代码不会更改它解析为的 名称。它改变的是最终被调用的函数。那不是动态命名;那是动态函数 dispatch。该名称在编译时得到解析;该函数在运行时得到解析。