首页 >后端开发 >C++ >为什么派生类中的重载方法需要显式方法调用?

为什么派生类中的重载方法需要显式方法调用?

DDD
DDD原创
2024-11-02 12:50:021056浏览

Why is Explicit Method Invocation Required for Overloaded Methods in Derived Classes?

C 重载解析:需要显式方法选择

在 C 中,重载解析根据参数类型和方法所在的范围进行被宣布。为了确保准确的方法选择,某些场景需要显式的方法调用。

考虑以下示例:

<code class="cpp">class A {
  public:
    int DoSomething() { return 0; }
};

class B : public A {
  public:
    int DoSomething(int x) { return 1; }
};

int main() {
  B* b = new B();
  b->A::DoSomething(); // Why this?
  // b->DoSomething(); // Why not this? (Compiler error)
  delete b;
  return 0;
}</code>

为什么语句是 b->A::DoSomething();有必要吗?

了解重载解析:

在这种情况下,编译器在执行重载解析时会考虑方法的范围。默认情况下,它仅在当前类的范围内搜索方法匹配。在类 B 中,编译器在当前范围内找到 DoSomething(int),它接受单个 int 参数。

需要显式调用:

但是,父类A 还声明了一个不带参数的 DoSomething() 版本。要在派生类 B 中访问此方法,必须使用类作用域运算符 (A::) 显式调用它。

语句 b->DoSomething();将无法编译,因为编译器无法在类 B 的范围内找到名为 DoSomething() 的不带参数的方法。它错误地认为 DoSomething(int) 是预期的方法。

解决方案:

为了解决这个问题,一种解决方案是在类 B 中引入 using 声明。这会将 DoSomething() 方法从父类拉入派生类的范围:

<code class="cpp">class B : public A {
public:
    using A::DoSomething;
    // …
};</code>

通过此修改,重载解析现在可以正确识别所需的 DoSomething() 方法,从而无需使用 b->A::DoSomething(); 进行显式调用。

以上是为什么派生类中的重载方法需要显式方法调用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn