【问题标题】:Does C++ use static name resolution or dynamic name resolution?C++ 使用静态名称解析还是动态名称解析?
【发布时间】:2023-03-14 01:19:02
【问题描述】:

我一直在 wikipedia (Name resolution WIKI) 中阅读有关“名称解析”的内容,并指出 C++ 使用“静态名称解析”。如果这是真的,那么我无法弄清楚 C++ 如何在不使用动态名称解析的情况下提供“多态性”。

谁能回答C++是使用“静态名称解析”还是“动态名称解析”。如果是静态的,能否也解释一下C++是如何提供多态性的。

【问题讨论】:

  • C++ 中所说的动态多态性都与关键字“virtual”有关。阅读有关它的更多信息。
  • 两者都用。当您使用抽象类时,请使用动态。对于模板、重载等其他内容,它使用静态。
  • @EdwinRodríguez 我不认为 名称解析 在您使用抽象类时是动态的。名称在编译时解析。
  • 为了澄清,任何人都可以指出以下段落中的错误。 C 和 D 是从 B 派生的类。B 具有虚函数 F 和 C,D 在其实现中覆盖了 F。 x 是指向 B 的指针,在我的应用程序中 x->F 可能是 B、C 或 D 的 F,具体取决于我将 x 指向的对象,我可以根据运行时的用户输入来执行此操作。如果 C++ 使用静态名称解析,则 x->F 必须仅与一个实体相关联,即在编译时与 B、C 或 D 的 F 相关联,并且不应在运行时更改。
  • "如果 C++ 使用静态名称解析,则 x->F 必须仅与一个实体关联,即与 B、C 或 D 中的 F" 不。这:"如果 C++ 使用静态名称解析然后有一些代码x->F 然后B::F 在编译时必须存在(但可以是虚拟的)。”动态名称解析与动态调度(虚函数)100%无关

标签: c++ token-name-resolution


【解决方案1】:

C++ 使用静态名称解析,因为它重命名每个函数以使每个函数都具有唯一性。
这意味着函数int foo(int bar) 将被编译器称为_Z3fooi,而int foo(float bar) 将被称为_Z3foof
这就是我们所说的name mangling

【讨论】:

  • Edwin Rodriguez 在 cmets 中说抽象类使用动态名称解析,您能说清楚吗?
  • @pasha:他混淆了动态名称解析和动态调度。它们无关。
  • 另外,我很确定名称修饰与静态与动态名称解析无关。
【解决方案2】:

Wikipedia 对名称解析的定义是关于如何将标记解析为构造的名称(函数、类型名称等)。鉴于该定义,C++ 是 100% static 及其名称解析。每个代表标识符的标记都必须在编译时与特定实体相关联。

C++ 多态实际上是在作弊。编译器可以看到静态名称解析为使用virtual 关键字定义的成员函数。如果编译器发现您调用 this 的对象是动态对象(即:指向该类型的指针/引用而不是该类型的值),编译器会发出特殊代码来调用该函数。

此特殊代码不会更改它解析为的 名称。它改变的是最终被调用的函数。那不是动态命名;即动态函数dispatch。该名称在编译时被解析;该函数在运行时得到解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多