I am confused about base class reference and derived class reference in the context of upcasting and downcasting.
In the following code, what is the use of &ref
? In the reference, it was marked as a base class reference, to which a derived class obj was assigned.
What is the concept behind this?
#include <iostream>
using namespace std;
class Base
{
public:
void disp()
{
cout << " It is the Super function of the Base class ";
}
};
class derive : public Base
{
public:
void disp()
{
cout << "\n It is the derive class function ";
}
};
int main ()
{
// create base class pointer
Base *ptr;
derive obj; // create object of derive class
ptr = &obj; // assign the obj address to ptr variable
// create base class's reference
Base &ref = obj;
// Or
// get disp() function using pointer variable
ptr->disp();
return 0;
}
Even though it is not clear what you're asking, i will try to clear some basics regarding this topic.
First, a reference refers to some other object. A reference is not an object by itself. So lets looks at some examples:
int n = 10;
int &r = n; // Here r is a reference to an int object
Similarly in your code snippet, when you wrote:
derive obj; //obj is an object of type derive
Base &ref = obj; // ref is bound to the Base part of derive
Base *ptr = &obj; // ptr points to the Base part of derive
In the above example, there are 2 important things to note:
ptr
is Base*
. While the dynamic type of the same object ptr
is derive*
. So the static and dynamic type differs.Also, note that we are able/allowed to write:
Base *ptr = &obj;
because as $11.2/5 states -
If a base class is accessible, one can implicitly convert a pointer to a derived class to a pointer to that base class.
Now coming back to your question:
what is the use of &ref?
class Base
{
public:
virtual void disp() //VIRTUAL kewword USED HERE
{
cout << " It is the Super function of the Base class ";
}
};
If in your code snippet, the method disp()
was virtual as shown in the above modified snippet, then we could've used ref
and ptr
to call the method disp()
of the derive
class. This is because:
According to virtual function documentation
a virtual function is a member function you may redefine for other derived classes, and can ensure that the compiler will call the redefined virtual function for an object of the corresponding derived class, even if you call that function with a pointer or reference to a base class of the object.
So when we write:
ref.disp(); //this calls the derive class method disp() at runtime
ptr->disp(); //this calls the derive class method disp() at runtime
The result of the above is that the derive class' function named disp
is called at run-time and we see It is the derive class function
printed on the console.
So basically the use is that we can decide at runtime which method(whether Base's or derive's) to call.
Check out the program's output here.