关于c ++:访问重载的基类方法,其名称与派生方法相同

Access overloaded base class method with same name as derived method

我正试图从与派生类中的方法同名的基类中调用方法。下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>

using namespace std;

class Base
{
public:
    void print() {
        cout <<"Printing from base" << endl;
    }

    void print(int num) {
        cout <<"Printing number from base:" << num << endl;
    }
};

class Derived : public Base
{
    using Base::print;

public:
    void print() {
        cout <<"Printing from derived" << endl;
    }
};


int main()
{
    Derived x;

    x.print();
    x.Base::print(1);

    //x.print(1); // Gives a compilation error

    return 0;
}

基本上,我希望能够调用x.print(1)并获得"printing number from base:1",即自动调用与签名匹配的方法,即使它位于基类中。

没有了using Base::print;,我得到了error: no matching function for call to 'Derived::print(int)',由于名字隐藏,这是完全合理的。

因此,我增加了这一行,但现在错误是error: 'void Base::print(int)' is inaccessible

为什么会这样?我使用公共继承,所以我会认为它是现成的?

如示例中所示,手动调用x.Base::print(1);可以很好地工作,但我希望更透明地执行此操作。当然,我可以在派生类中为函数重新实现一个包装器,但这看起来也不太优雅。

我很抱歉,如果前面的一个问题已经涉及到这一点,我读了很多类似的案例,但没有任何帮助。


使用指令的位置决定了可见性。只要把它放在公共区域就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
//...
class Derived : public Base
{

public:
    using Base::print;

    void print() {
        cout <<"Printing from base" << endl;
    }
};
//...

http://ideone.com/06nnk


您可以使您的功能虚拟化。从基类继承的任何未重载的虚拟函数都将通过派生类调用。

1
2
3
4
5
6
7
8
9
10
11
12
class base
{
  public:
    virtual void Foo() {}
}

class Derived
{
}

Derived d;
d.foo(); // calls base::foo()