Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are some 'good use' examples of dynamic casting?

Tags:

We often hear/read that one should avoid dynamic casting. I was wondering what would be 'good use' examples of it, according to you?

Edit:

Yes, I'm aware of that other thread: it is indeed when reading one of the first answers there that I asked my question!

like image 549
OysterD Avatar asked Aug 26 '08 13:08

OysterD


People also ask

What is dynamic casting used for?

Dynamic Cast: A cast is an operator that converts data from one type to another type. In C++, dynamic casting is mainly used for safe downcasting at run time. To work on dynamic_cast there must be one virtual function in the base class.

Why do we use the dynamic cast type conversion?

Why we use the “dynamic_cast” type conversion? Explanation: It is used to check that operators and operands are compatible after conversion.

Can dynamic cast be used with references?

The dynamic_cast operator can be used to cast to reference types. C++ reference casts are similar to pointer casts: they can be used to cast from references to base class objects to references to derived class objects.

Can we use dynamic cast for Upcasting?

In C++, dynamic casting is, primarily, used to safely downcast; i.e., cast a base class pointer (or reference) to a derived class pointer (or reference). It can also be used for upcasting; i.e., casting a derived class pointer (or reference) to a base class pointer (or reference).


2 Answers

This recent thread gives an example of where it comes in handy. There is a base Shape class and classes Circle and Rectangle derived from it. In testing for equality, it is obvious that a Circle cannot be equal to a Rectangle and it would be a disaster to try to compare them. While iterating through a collection of pointers to Shapes, dynamic_cast does double duty, telling you if the shapes are comparable and giving you the proper objects to do the comparison on.

Vector iterator not dereferencable

like image 58
Mark Ransom Avatar answered Sep 18 '22 21:09

Mark Ransom


Here's something I do often, it's not pretty, but it's simple and useful.

I often work with template containers that implement an interface, imagine something like

template<class T> class MyVector : public ContainerInterface ... 

Where ContainerInterface has basic useful stuff, but that's all. If I want a specific algorithm on vectors of integers without exposing my template implementation, it is useful to accept the interface objects and dynamic_cast it down to MyVector in the implementation. Example:

// function prototype (public API, in the header file) void ProcessVector( ContainerInterface& vecIfce );  // function implementation (private, in the .cpp file) void ProcessVector( ContainerInterface& vecIfce) {     MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);      // the cast throws bad_cast in case of error but you could use a     // more complex method to choose which low-level implementation     // to use, basically rolling by hand your own polymorphism.      // Process a vector of integers     ... } 

I could add a Process() method to the ContainerInterface that would be polymorphically resolved, it would be a nicer OOP method, but I sometimes prefer to do it this way. When you have simple containers, a lot of algorithms and you want to keep your implementation hidden, dynamic_cast offers an easy and ugly solution.

You could also look at double-dispatch techniques.

HTH

like image 36
rlerallut Avatar answered Sep 17 '22 21:09

rlerallut