c++functionoopvariable-types

Variable types from inherited classes


If I have a class that inherits from a base class, can I use that base class as a variable type in c++?

class Component {
    // Code here
};

class TransformComponent : public Component {
    // Code here
};

class Entity {
   // Code here
   
   Component *getComponent(Component *searchComponent) {
      // Code Here
   }
};

as you can see here, I am using the base class "Component" as a return type and a variable type. The problem is that the user may input a "TransformComponent". The only reason I am asking this is because the "TransformComponent" class inherits from the "Component" class and there might be a way to do this?

<Entity>.getComponent(Component &TransformComponent());

The answer I'm looking for is one that works both for the return type, and the variable type.


Solution

  • Absolutely! It's one of the beauties of OOP. Your instanced class of type TransformComponent is both an instance of Component as well as TransformComponent.

    If you had some function that returned a type of Component, this could return any class derived from Component as a Component! If you later wanted to refer to it as its sub-class, you might have to check its type and then cast to it, but what you want is absolutely possible, and you're going the right way about it.

    In fact, in the example you describe, were you are using Component and the user might pass a TransformComponent, all of the base methods and properties that the Component possesses will be possessed by TransformComponent too. It will look and feel as if it was a Component, with all the benefits of being one.

    The only time a problem will arise is if you specifically want to access the features of a TransformComponent, and the user passed a Component. The parent class doesn't know about the sub-class stuff, because it isn't an instance of one, it will throw up errors for you. Sub-classes build upon the base class, so they have all the base-class stuff, plus more. Basically its only an issue when your example is reversed.