W takim razie musisz przemyśleć na poważnie strukturę swojego programu. Szkoda, że podałeś mało informacji o tym, w jaki sposób i przez co będą odbierane te dane różnego typu. To ma istotne znaczenie, bo, jeżeli przyjmiemy taki scenariusz, że dane (jak założyłeś prywatne) interesują konkretny obiekt to możesz przypadki "odbioru" zrealizować wewnątrz tych klas przekazując ten obiekt. Mały przykład: https://ideone.com/V32K5J
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Receiver
{
public:
virtual ~Receiver() = default;
virtual void receiveDataA(int intData, float floatData) = 0;
virtual void receiveDataB(string stringData, double doubleData) = 0;
};
class BaseData
{
public:
using Ptr = unique_ptr<BaseData>;
virtual ~BaseData() = default;
virtual void receiver(Receiver& receiver) = 0;
};
class DataA : public BaseData
{
public:
DataA(int intData, float floatData) : mIntData{intData}, mFloatData{floatData} {}
void receiver(Receiver& receiver) override
{
receiver.receiveDataA(mIntData, mFloatData);
}
private:
int mIntData;
float mFloatData;
};
class DataB : public BaseData
{
public:
DataB(string stringData, double doubleData) : mStringData{stringData}, mDoubleData{doubleData} {}
void receiver(Receiver& receiver) override
{
receiver.receiveDataB(mStringData, mDoubleData);
}
private:
string mStringData;
double mDoubleData;
};
struct Object : public Receiver
{
void receive(BaseData& data)
{
data.receiver(*this);
}
void receiveDataA(int intData, float floatData) override
{
cout << "receiveDataA[" << intData << ',' << floatData << "]\n";
}
void receiveDataB(string stringData, double doubleData) override
{
cout << "receiveDataB[" << stringData << ',' << doubleData << "]\n";
}
};
int main()
{
vector<BaseData::Ptr> mData;
mData.push_back(make_unique<DataA>(100, 1.));
mData.push_back(make_unique<DataB>("Hello", 2.f));
mData.push_back(make_unique<DataB>("World!", 150.f));
mData.push_back(make_unique<DataA>(200, 50.));
Object object;
for (auto& data : mData)
{
object.receive(*data);
}
return 0;
}