I have 3 classes: A
, B
, and AnotherClass
. Where B
is derived from A
:
class A {
public:
A(){}
virtual void method() {//default action}
};
Then I have a derived class, B:
class B : public A {
public:
B(){}
void method() {//redefine action}
};
And AnotherClass
:
class AnotherClass {
public:
AnotherClass(A& a);
A a;
anotherMethod(){ a.method()}
};
AnotherClass :: AnotherClass(A& a) : a(a) //initialization
So, if I construct an object of AnotherClass
with an object of B
:
B b();
AnotherClass myObj(b);
Keep in mind, since B
inherits from A
, and AnotherClass
accepts an object of A
, I am able to successfully pass in a B
object as the argument.
And I call:
myObj.anotherMethod();
I expect this to execute anotherMethod()
, and when it does, I expect it to call the REDEFINED method()
that belongs to B
, but instead it calls the default method()
defined in A
I was thinking my problem is because I specify the argument of AnotherClass
as an object of class A
. However, I do not want to change this argument to an object of class B
because I also have classes C
, D
, and E
, that also inherit directly from A
. So I want to use the base class as the argument type so I am not limited to only being able to pass in a b
object. But, I read some older posts on this site and most proposed solutions was to pass the derived object (b
) by reference, which I am doing.
Can someone explain why this is happening?