If we assume that identifying the version is relatively simple, you could actually do something like this:
Code:
class baseversion
{
private:
// Class members that are common to all versions for currently oldest supported version.
public:
virtual int readData() = 0;
virtual int writeData() const = 0;
};
class version5: public baseversion
{
private:
// Add version5 onwards data members.
public:
virtual int readData();
virtual int writeData();
};
class version6: public version5
{
private:
// Add version6 onwards data members.
public:
virtual int readData();
virtual int writeData();
};
Then you have a factory function that does something like this:
Code:
baseversion *factory()
{
int version = figureoutversion();
baseversion *ptr;
switch(version)
{
case 5:
ptr = new version5;
break;
case 6:
ptr = new version6;
break;
default:
// Handle "unknown version" error.
break;
}
}
This is of course just the principle. You'd need to write a fair bit more code, and you probably need some symbolic names and such for constants where I've used 5, 6 etc.
--
Mats