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++.
You need to use a using declaration inside the definition of class
B
: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, soA::foo
is not found.You're not overriding
A::foo(int)
's implementation, instead you're aliasingA::foo
and changing its signature to (int,int) instead of (int). As James McNellis mentioned theusing A::foo;
declaration makes the function from A available.