Есть два способа сделать это.
Ваш путь в порядке (с небольшими изменениями), если у вас уже есть полиморфные типы).(Если B
is-an A
, логически)
class A
{
public:
virtual void f() { /* something */ };
};
class B : public A
{
public:
virtual void f() { /* something else */ };
};
int main()
{
A a;
B b;
A* c = 0;
// based on your condition
c = &a;
c->f();
c = &b;
c->f();
return 0;
}
Но что, если ваши типы на самом деле не так тесно связаны?Использование наследования подразумевает очень жесткие (в данном случае) отношения между вашими классами.Является ли B
действительно A
?
Вот способ сделать это для классов, имеющих одинаковые именованные функции, но на самом деле не схожих типов.
template <class T>
void do_f(T& obj)
{
obj.f();
}
class D
{
public:
void f() { /* something */ }
};
class E
{
public:
void f() { /* something else entirely */ }
};
int main()
{
// note, D and E have no relation
D d;
E e;
// based on your condition
do_f(d);
do_f(e);
}