【问题标题】:Why are the inherited functions hidden in base class in this code? [duplicate]为什么在这段代码中,继承的函数隐藏在基类中? [复制]
【发布时间】:2012-04-03 05:19:11
【问题描述】:

可能重复:
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&lt;double&gt; ) 的签名与 f() 的其他两个继承版本不同。

  • 为什么在这种情况下这三个都不可见?
  • 在这种情况下,有哪些方法可以确保 Base 函数可见?

【问题讨论】:

  • 我可以推荐 Effective C++:技巧 33

标签: c++ inheritance


【解决方案1】:

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

这就是名称隐藏的工作原理。内部范围内的名称隐藏了外部范围内的所有名称(这发生在重载决议或其他任何事情发生之前)。

2) 在这种情况下,有哪些方法可以确保 Base 函数可见?

使用using 声明(using Base::f;using Base::g;)将它们的名称带入内部作用域,或者更改它们的名称以使它们不会被派生类中的名称隐藏。

【讨论】:

  • (关于 1)但签名不同!一个签名如何隐藏另一个签名?
  • @Lazer:签名不同,但名称相同。名称隐藏适用于名称。
  • @Lazer 因为是名字隐藏,而不是签名隐藏。
  • @KonradRudolph:哇,C++ 是个黑洞。
【解决方案2】:

http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9

基本上,Derived::f(complex&lt;Double&gt;) 隐藏 Base::f(int)Base::f(double)。您可以通过将using Base::f 添加到Derived 的定义中来重新公开它们。

Effective C++ 的第 33 条很好地解释了这样做的理由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多