Skip to main content

RTTI

Oh, do not confuse this word with RTI - right to information. This is not a political blog :).

RTTI - run time type identification is a concept in C++, which gives the type of the object during run time. But it can be used only with polymorphic classes - i.e. the classes which have at least one virtual function.

Typeid

typeid is an operator in C++ which gives the actual type of the object. So what is actual type of object? Is it different from the one we have defined it with?

It may be.

class A
{
public:
   virtual void print(){}
};
class B:public A
{
};
int main()
{
   int a;
   A obj1;
   B obj2;
   A *ptr1 = new B;
}
   

 In the code above, type of a is integer. Type of obj1 is A. Type of obj2 is B.

But what about *ptr1? Is the type of *ptr1 A or B?

typeid operator correctly gives its type as B.

Note : We have added a dummy print function in base class, to make A as polymorphic.

Now let us use typeid operator - which needs the inclusion of header file typeinfo


#include<iostream>
#include<typeinfo>
using namespace std;
class A
{
public:
   virtual void print(){}
};
class B:public A
{
};
int main()
{
   int v1;
   A obj1;
   B obj2;
   A *ptr1 = new B;
   cout<<"Type of v1 is "<<typeid(a).name()<<endl;
   cout<<"Type of obj1 is "<<typeid(obj1).name()<<endl;
   cout<<"Type of *ptr1 is "<<typeid(*ptr1).name()<<endl; 
}
   
 But when you run this program, you may see some strange names instead of class names.

The reason is typeid().name returns mangled name in case of gcc compilers. To get unmangled name, straight forward method is to use

./a.out |c++filt -t
Type of v1 is int
Type of obj1 is A
Type of *ptr1 is B



Next let us see how to use dynamic_cast

Dynamic cast

dynamic_cast is used for safe conversion of variables. It can be used for upcast or even downcast also. If we use correct type for dynamic_cast, we get the required value. If not, the program aborts with type error.


#include<iostream> 
using namespace std;
class A
{
 int na;  
public:
virtual void print()
{
   cout<<"print function of class A"<<endl;
}
};
class B:public A
{
  int nb;
};
class C:public A
{
  int nc;
};
void printDyn(A&obja)
{
  cout<<"We are in printDyn function"<<endl; 
  C &refc = dynamic_cast<C&>(obja);
  cout<<"we call print function";
  refc.print();
}
int main()
{ 
    C objc;
    printDyn(objc);
    B objb;
    printDyn(objb);  
}

In this program in printDyn() function, we are converting the reference parameter to C reference. In the first call printDyn(objc), the code works fine because, objc is a C type object.

But when we call the function with object of B class and try to convert it into C reference, the program gives a bad_cast exception and aborts.

Output of the program will be
./a.out
We are in printDyn function
we call print functionprint function of class A
We are in printDyn function
terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
Aborted



Please remember that target of dynamic_cast must be either a pointer or a reference to a class.

You can get these notes and also programs, quiz on C++ by downloading the app Simplified C++ by Hegdeapps 


Comments

Popular posts from this blog

Find the error in C++ program

This C++ program is not compiling. What do you think is the error with the program? #include<iostream> using namespace std; int main() {    int arr[10];    arr={1,2,3,4,5,6,7,8};    cout<<"arr[0]="<<arr[0];    return 0; } Is the error due to Not using printf Initialising the array with only 8 elements instead of 10 Initialising array in the next statement instead of in definition. None of the above  Now if you like this question, there are plenty more questions like this and programs and notes in my app Simplified C++. Download the Simplif ied C++   by Hegdeapps now By the way the correct answer is (3)

Abstract class

 If we can not create any objects of a class, then it is called an abstract class. A class is made abstract by adding at least one pure virtual function to it. Pure virtual function A function is said to be a pure virtual function , if it has no definition but has only declaration. Pure virtual function is defined with the keyword virtual and followed by return type, function name and "=0". class Shape { public: virtual void printarea() =0 ; }; int main () { Shape obj1; //error } Here printarea() function of Shape class is a pure virtual function as it has no body. To make a function as pure virtual function, you should use =0 at the end of virtual function declaration Abstract class When a class has at least one pure virtual function, it is incomplete and no objects can be created from that class. Such a class is called an abstract class . In the earlier example class Shape is an abstract class, and objects can not be created from t...

Friends of C++

Friend function Remember that a member which is not public (Private and protected )  can not be accessed from outside the class.  Three are some situations where you may need to access these. Keyword friend  is used for this. A friend functions and classes can access all members of a class.  This concept is controversial. People say friend concept violates data encapsulation  A friend function is a non-member function but still can access all the members of a class including private members. Such a function is declared within class body with the prefix "friend" class Number { int num; public: Number( int m){ /*code*/ } friend void printNum(Number ob); /*friend function*/ }; void printNum (Number obj) { cout << obj.num << "endl" ; } printNum() is not member of class Number . But it can still access all members including private members, because it is a friend. Friend class An object of a friend c...