我了解到内部名称隐藏了外部名称(因此重载不会跨越范围),因为名称查找在类型匹配之前进行。所以我写了下面的 C++ 代码来玩这个规则:
class Base {
public:
virtual void fcn() {}
};
class Derived : public Base {
public:
void fcn(std::string s) {}
};
Base* bp = new Derived;
bp->fcn();
delete bp;
根据隐藏规则,Derived::fcn(std::string)函数应该隐藏Base::fcn(). 但是上面的代码无视规则编译并正确运行。这是否意味着动态绑定可以覆盖隐藏在 C++ 中的名称?问题是,如果我将类型更改为bpto Derived*,隐藏规则会通过发出编译错误来生效:
'Derived::fcn':函数不接受 0 个参数
你能帮我解释一下这个现象吗?具体来说,动态绑定可以覆盖我假设的名称隐藏吗?如果是这样,如果指针指向派生类,为什么覆盖会失败?谢谢你。