【发布时间】:2011-08-21 04:12:16
【问题描述】:
我看到它声明 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() 的处理方式不同,因为它是一个重载。
【问题讨论】:
-
有点含糊......你能澄清一下实际问题吗?
-
这不仅仅是虚函数的问题,普通的成员函数也有这个“问题”。
-
base::foo(int)的处理方式与base::bar()没有区别;它只是被derived::foo()隐藏了。如果derived有一个名为bar的成员,那么它将以完全相同的方式隐藏base::bar(),无论它是否也被重载。 -
@Mike Seymour:很有趣,因为派生结构没有提及任何关于
foo(int)的内容,但它的行为仍然与bar()不同。如果那不是不同的处理方式,我不知道是什么。 -
那么也许你应该澄清你的意思是“区别对待”,因为恐怕我很难理解你在说什么。
derived有一个名为foo的成员,它隐藏了任何继承的同名成员(除非您明确地将其包含在using中)。它没有名为bar的成员,因此具有该名称的继承成员仍然可见。这些都与重载或虚函数无关,据我所知,在隐藏它们时,这些东西的处理方式与其他任何东西都没有区别。
标签: c++ oop inheritance