Baumann
Baumann

Reputation: 1159

How to call a method that expects a subclass object with an subclass object referenced by a pointer to its superclass?

I have an object that is referenced by a pointer to its superclass: Base* d1 = new Derived();

I would like to pass it to another method that expects an object of the derived class: void f(Derived* d);

But it doesn't work unless I use type-casting. Is there another way to achieve this?

Here is an example:

#include <stdio>
class Base {};
class Derived : public Base {};

class Client
{
   public:
   void f(Base* b) { printf("base"); };
   void f(Derived* d) { printf("derived"); };
};

int main(int argc, char* argv[])
{
   Client*  c  = new Client();
   Base*    b  = new Base();
   Base*    d1 = new Derived();
   Derived* d2 = (Derived*) d1;

   c->f(b);  // prints "base". Ok.
   c->f(d1); // prints "base"! I expected it to be "derived"!
   c->f(d2); // prints "derived". Type-casting is the only way?
}

Upvotes: 1

Views: 65

Answers (1)

Edgar Rokjān
Edgar Rokjān

Reputation: 17483

Generally speaking, you can do some stuff with dynamic_cast.

From the other side I believe, that dynamic_cast can practically always be avoided by the good design.

In your example you can make function f virtual member of Base class and override it in the Derived class. Then call it f via pointer to Base.

Something like this:

class Base {
    public:
        virtual void f() {
            printf("Base\n");
        }
};

class Derived : public Base {
    public:
        virtual void f() {
            printf("Derived\n");
        }
};

class Client
{
   public:
       void f(Base* b) {
           b->f();
       };
};

Upvotes: 3

Related Questions