2012-03-18 46 views
0

可能重复:
C++: rationale behind hiding rule为什么在这个代码中隐藏在基类中的继承函数?

在此代码示例从http://www.gotw.ca/gotw/005.htm,我感到非常震惊地得知,类派生,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()。

  • 为什么在这种情况下所有三个都不可见?
  • 在这种情况下如何确保Base函数可见?
+1

我可以推荐Effective C++:Tip 33 – inf 2012-03-18 11:53:23

回答

2

1)为什么在这种情况下所有三个都不可见?

这是名称隐藏的工作原理。内部作用域中的名称隐藏了所有来自外部作用域的名称(并且这发生在重载解析或其他任何事情发生之前)。

2)在这种情况下,确保Base函数可见的方法是什么?

把他们的名字与using声明(using Base::f;using Base::g;)内的范围,或者改变它们的名称,使得它们不被在派生类的名字隐藏。

+0

(关于1)但签名是不同的!一个签名如何隐藏另一个签名? – Lazer 2012-03-18 11:55:40

+0

@拉泽尔:签名是不同的,但名称是相同的。姓名隐藏作品。 – Mankarse 2012-03-18 12:00:51

+0

@Lazer因为它是*名称隐藏*,而不是*签名*隐藏。 – 2012-03-18 12:02:05

相关问题