为什么继承的函数隐藏在此代码的基类中?

时间:2012-03-18 11:46:56

标签: c++ inheritance

  

可能重复:
  C++: rationale behind hiding rule

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()版本不同。

  • 为什么这三种情况在这种情况下都不可见?
  • 在这种情况下,有哪些方法可以确保基本功能可见?

2 个答案:

答案 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项很好地解释了这一点的基本原理。