在http://www.gotw.ca/gotw/005.htm的代码示例中,我很震惊地发现在Derived类中,f(int)
和f(double)
不可见!
class Base {
public:
virtual void f( int ) {
cout << "Base::f(int)" << endl;
}
virtual void f( double ) {
cout << "Base::f(double)" << endl;
}
virtual void g( int i = 10 ) {
cout << i << endl;
}
};
class Derived: public Base {
public:
void f( complex<double> ) {
cout << "Derived::f(complex)" << endl;
}
void g( int i = 20 ) {
cout << "Derived::g() " << i << endl;
}
};
这背后的原因是什么?
据我所知,f( complex<double> )
的签名与其他两个继承的f()版本不同。
答案 0 :(得分:2)
1)为什么这三种情况在这种情况下都不可见?
这就是名称隐藏的工作原理。内部作用域中的名称会隐藏外部作用域中的所有名称(这会在重载解析或其他任何事情发生之前发生)。
2)在这种情况下,有哪些方法可以确保基本功能可见?
使用using
声明(using Base::f;
,using Base::g;
)将其名称带入内部作用域,或更改其名称,以便它们不会被派生类中的名称隐藏。< / p>
答案 1 :(得分:1)
请参阅http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9。
基本上,Derived::f(complex<Double>)
隐藏 Base::f(int)
和Base::f(double)
。您可以通过将using Base::f
添加到Derived
的定义中来重新公开它们。
Effective C++的第33项很好地解释了这一点的基本原理。