As I am practicing C++ with some of my colleagues, one of them "experienced a bug" within a derived class. Long story short, he was calling the base method (callFoo
) and he was expecting to be calling A::Foo()
, but he got B::Foo()
instead.
Here's a complete example of what I am actually asking. I don't really know how to explain better than this. I have indeed found a solution, but that solution is awkward; it makes the code kind of hard to "sanitize" for the future extensions of our classes. Are there other solutions available? (Maybe a keyword?)
n.b. The example is purely demonstrative: in the original example callFoo()
was the operator=
for Class A
. I tried my best to simplify it.
Example 1: Unwanted behavior
#include <iostream>
class A{
public:
virtual void Foo(){
std::cout<<"A Foo\n";
}
virtual void callFoo(){
Foo();
}
};
class B: public A{
public:
virtual void Foo() override{
std::cout<<"B Foo\n";
}
};
int main(){
B mB;
mB.Foo();
mB.callFoo();
return 0;
}
Example 2: The non-ideal fix; are there other solutions?
class A{
public:
virtual void Foo(){
std::cout<<"A Foo\n";
}
virtual void callFoo(){
A::Foo();
}
};