Вы можете сначала привести к указателю C2
, если знаете, что имеете дело с объектом C2:
func(*teste1); // Want "Func 1"
func(*static_cast<C2*>(teste2)); // Want "Func 2"
В качестве альтернативы, вы можете сделать C2
полиморфным, имея виртуальную функцию в C1
:
class C1 {
public:
virtual ~C1() {}
};
И тогда вы можете сделать dynamic_cast
:
func(*dynamic_cast<C2*>(teste2)); // Want "Func 2"
Обратите внимание, что если вы не уверены, какой тип объекта выhave, dynamic_cast
вернет нулевой указатель, если он потерпит неудачу, так что вы можете сделать:
if(dynamic_cast<C2*>(teste2)) {
func(*dynamic_cast<C2*>(teste2)); //If it's a C2, call the C2 overload
} else {
func(*teste2); //If it's a C1, call the C1 overload
}
Или, что еще лучше, вообще не использовать указатели, если вы можете избежать этого !!