I'm not sure if I understood correctly, but it seems simple enough. Look at this code:
Code:
#include <iostream>
class Base
{
public:
virtual void Print() = 0;
};
class A : public Base
{
public:
virtual void Print()
{
std::cout << "I am a class A" << std::endl;
}
};
class B : public Base
{
public:
virtual void Print()
{
std::cout << "I am a class B" << std::endl;
}
};
Base* foo(A* obj1, A* obj2)
{
return obj1; //return an A*
}
Base* foo(A* obj1, B* obj2)
{
return obj1; //return an A*
}
Base* foo(B* obj1, A* obj2)
{
return obj2; //return an A*
}
Base* foo(B* obj1, Base* obj2)
{
return obj1; //no A*, return a Base*
}
int main()
{
A a;
B b;
foo(&a,&a)->Print();
foo(&a,&b)->Print();
foo(&b,&a)->Print();
foo(&b,&b)->Print();
return 0;
}
However, it's much simpler to use a dynamic_cast; instead of 4 functions, you only need one function. Consider this:
Code:
#include <iostream>
class Base
{
public:
virtual void Print() = 0;
};
class A : public Base
{
public:
virtual void Print()
{
std::cout << "I am a class A" << std::endl;
}
};
class B : public Base
{
public:
virtual void Print()
{
std::cout << "I am a class B" << std::endl;
}
};
Base* foo(Base* obj1, Base* obj2)
{
//if obj1 is an A*, return it
if(dynamic_cast<A*>(obj1) != NULL)
return obj1;
//it doesn't matter if obj2 is an A* or B*
//we have to return something
return obj2;
}
int main()
{
A a;
B b;
foo(&a,&a)->Print();
foo(&a,&b)->Print();
foo(&b,&a)->Print();
foo(&b,&b)->Print();
return 0;
}