Overloading a super class's function

自作多情 提交于 2019-12-06 20:59:37

问题


Is there something in the C++ standard that prevents me from overloading a super class's function?

Starting with this pair of classes:

class A {            // super class
    int x;

public:
    void foo (int y) {x = y;}  // original definition
};

class B : public A { // derived class
    int x2;

public:
    void foo (int y, int z) {x2 = y + z;}  // overloaded
};

I can call B::foo() easily:

    B b;
    b.foo (1, 2);  // [1]

But if I try to call A::foo() ...

    B b;
    b.foo (12);    // [2]

... I get a compiler error:

test.cpp: In function 'void bar()':
test.cpp:18: error: no matching function for call to 'B::foo(int)'
test.cpp:12: note: candidates are: void B::foo(int, int)

Just to make sure I wasn't missing something, I changed the name of B's function so that there is no overload:

class B : public A {
    int x2;

public:
    void stuff (int y, int z) {x2 = y + z;}  // unique name
};

And now I can call A::foo() using the second example.

Is this standard? I'm using g++.


回答1:


You need to use a using declaration inside the definition of class B:

class B : public A {
public:
    using A::foo;          // allow A::foo to be found
    void foo(int, int);
    // etc.
};

Without the using declaration, the compiler finds B::foo during name lookup and effectively does not search base classes for other entities with the same name, so A::foo is not found.




回答2:


You're not overriding A::foo(int)'s implementation, instead you're aliasing A::foo and changing its signature to (int,int) instead of (int). As James McNellis mentioned the using A::foo; declaration makes the function from A available.



来源:https://stackoverflow.com/questions/4597032/overloading-a-super-classs-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!