class IReadableDataset
{
public:
virtual void SayReadableDataset() const = 0;
};
class IEditableDataset: virtual public IReadableDataset
{
public:
virtual void SayEditableDataset() const = 0;
};
class IStatisticalDataset: virtual public IReadableDataset
{
public:
virtual void SayStatisticalDataset() const = 0;
}
class CDatasetImpl: public IEditableDataset, public IStatisticalDataset
{
public:
virtual void SayReadableDataset() const;
virtual void SayEditableDataset() const;
virtual void SayStatisticalDataset() const;
};
class ReadableDataset
{
public:
virtual void SayReadableDataset() const = 0;
};
template<class Base>
class EditableDataset: public Base
{
public:
virtual void SayEditableDataset() const = 0;
};
template<class Base>
class StatisticalDataset: public Base
{
public:
virtual void SayStatisticalDataset() const = 0;
};
class CDatasetImpl: public StatisticalDataset<EditableDataset<ReadableDataset> >
{
public:
virtual void SayReadableDataset() const
{
std::cout << "SayReadableDataset" << std::endl;
};
virtual void SayEditableDataset() const
{
std::cout << "SayEditableDataset" << std::endl;
};
virtual void SayStatisticalDataset() const
{
std::cout << "SayStatisticalDataset" << std::endl;
};
};
template<class T>
void statistic(const StatisticalDataset<T>& x)
{
x.SayReadableDataset();
x.SayStatisticalDataset();
}
template<class T>
void edit(EditableDataset<T>& x)
{
x.SayReadableDataset();
x.SayEditableDataset();
}
void read(const ReadableDataset& x)
{
x.SayReadableDataset();
}
int main()
{
CDatasetImpl a;
read(a);
edit(a);
statistic(a);
return 0;
}
virtual
для указания того, что данный метод — виртуальный.