У вас странный подход. Общепринятое решение - создать базовый класса с виртуальным методом, который переопределять в потомках. Тогда выбор необходимого метода будет происходить на основе типа
#include <iostream>
#include <string>
#include <functional>
class BaseVirtual{
private:
virtual int func(int v) = 0;
public:
int runFunc(int v){return func(v);};
virtual ~BaseVirtual() = default;
};
class MyClass: public BaseVirtual{
private:
int func(int v) override {
return v * 42;
};
public:
MyClass(){}
~MyClass(){
std::cout << "destructed MyClass" << std::endl;
};
};
class MyClass2: public BaseVirtual{
private:
int func(int v) override {
return v * 42 * 2;
};
public:
MyClass2(){}
~MyClass2(){
std::cout << "destructed MyClass2" << std::endl;
};
};
int main()
{
BaseVirtual *c = new MyClass();
std::cout << c->runFunc(2) << std::endl;
delete c;
c = new MyClass2();
std::cout << c->runFunc(2) << std::endl;
delete c;
return 0;
}