I have a base class and a child class extending it. The child class has its own method inside that the parent class does not have. That is, declaring it as virtual in the base class is not really an option.
class A {
public:
virtual void helloWorld();
};
class B : public A {
public:
virtual void helloWorld();
void myNewMethod();
};
Then, in my implementation, I have a pointer to A and I constructed it as B:
// somewhere in a .cpp file
A* x;
x = new B();
x->myNewMethod(); // doesn't work
My current solution is to cast it:
((B *)x)->myNewMethod();
My question is, is there a cleaner way of doing this, or is casting the way to go?
A
does not define any method calledmyNewMethod()
, hence it can't invoke it.Even though I normally strongly discourage from casting, here indeed casting is the only way.
A run-time cast seems to be OK in this case. However, rather than C-style casts, you should use
dynamic_cast<>
(in case you are not sure whetherx
actually points to an object of type ofB
):On the other hand, if you are sure that
x
points to an object of typeB
, then you should usestatic_cast<>
:Well, you'll have to cast but you can make the code look cleaner/more readable by hiding the ugly casting syntax in a function.