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中文网其他相关文章!