我看到它声明 C++ 隐藏名称是为了减少脆弱的基类问题。但是,我绝对看不出这有什么帮助。如果基类引入了以前不存在的函数或重载,它可能与派生类引入的函数或重载冲突,或者对全局函数或成员函数的非限定调用——但我没有看到这与重载有何不同.为什么要区别对待虚函数的重载与其他任何函数?
编辑:让我再向您展示一下我在说什么。
struct base {
virtual void foo();
virtual void foo(int);
virtual void bar();
virtual ~base();
};
struct derived : base {
virtual void foo();
};
int main() {
derived d;
d.foo(1); // Error- foo(int) is hidden
d.bar(); // Fine- calls base::bar()
}
这里,foo(int)
与 bar()
的处理方式不同,因为它是一个重载。
最佳答案
我假设“脆弱的基类”是指对基类的更改可能会破坏使用派生类的代码(这是我在 Wikipedia 上找到的定义)的情况。我不确定虚函数与此有什么关系,但我可以解释一下隐藏如何有助于避免这个问题。考虑以下几点:
struct A {};
struct B : public A
{
void f(float);
};
void do_stuff()
{
B b;
b.f(3);
}
do_stuff
中的函数调用调用B::f(float)
。
现在假设有人修改了基类,并添加了一个函数void f(int);
。如果不隐藏,这将更好地匹配 main
中的函数参数;您要么更改了 do_stuff
的行为(如果新函数是公共(public)的),要么导致编译错误(如果它是私有(private)的),而没有更改 do_stuff
或任何它的直接依赖关系。使用隐藏,您并没有改变行为,只有当您使用 using
声明明确禁用隐藏时,这种破坏才有可能。
关于c++ - 名称隐藏和脆弱的基础问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928535/