Reputation: 857
Consider I have series of derived classes for example as listed below:
class A
{
...
}
class B1 : public A //there may be many B's here say, B2, B3 etc
{
...
}
class C1 : public B1 //may be more C's as well
{
...
}
I would like to put all of the objects in single container, thus all would be of type class A
.
Suppose I would like to add a function to class C1
, what would be the best way to achieve this? My options would be introducing it in the base class A
and write the needed implementation in C1
, or, I could introduce it in C1
and do dynamic casting to access it. Which one is preferred? Is dynamic casting too expensive? (My main constrain is the run time.I have a flag in the base class to indicate what type of derived object it is, thus I do not have to dynamic cast every object in the container. Does adding unnecessary functions to base class can result in bad instruction cache use?)
Upvotes: 1
Views: 112
Reputation: 1630
adding a virtual function to your base class A is better because:
you should avoid dynamic cast especially in performance sensitive code. Please see Performance of dynamic_cast?
you should avoid having conditions to examine the object type (e.g. is it A, B1, or C1 ?) before performing a type-specific operation. Not only because it's slow, but also because if you do so, every time you add a new object type (e.g. C2) you will need to check all those conditions to see if they need to be updated.
Upvotes: 0
Reputation: 96233
You don't tell us the purpose of the new function in C1
, and this does affect the answer, but as rough guidelines:
A
.C
series of classes but it can follow some general pattern (for example post-processing), add a post_process
method to A
, override it in C1
, and have that method call private implementation methods of C1
to do the actual specific post-processing task.Upvotes: 2