#include <iostream>
using namespace std;
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* datasetImpl = new CDatasetImpl;
ReadableDataset* readable = dynamic_cast<ReadableDataset*>(datasetImpl);
readable->SayReadableDataset();
cout << "===" << endl;
EditableDataset<ReadableDataset>* editable = dynamic_cast<EditableDataset<ReadableDataset>*>(datasetImpl);
editable->SayReadableDataset();
editable->SayEditableDataset();
cout << "===" << endl;
StatisticalDataset<EditableDataset<ReadableDataset> >* statistical = dynamic_cast<StatisticalDataset<EditableDataset<ReadableDataset> >*>(datasetImpl);
statistical->SayReadableDataset();
statistical->SayStatisticalDataset();
statistical->SayEditableDataset();//этого метода из этого интерфейса видно быть не должно
return 0;
}
// #include <iostream>
// #include <string>
// using namespace std;
//
//
// class IReadableDataset
// {
// public:
// virtual string sayReadable() const = 0;
// };
//
//
//
// Первый из двух родителей для Dataset1
// template <typename T=IReadableDataset>
// class IEditableDataset : public T
// {
// public:
// virtual string sayEditable() const = 0;
// };
//
// Второй из двух родителей для Dataset1
// class IStatistics : public IReadableDataset
// {
// public:
// virtual string sayStatistics() const = 0;
// };
//
// class Dataset : public IEditableDataset<IStatistics> {
// public:
// virtual string sayReadable() const;
// virtual string sayEditable() const;
// virtual string sayStatistics() const;
// };
//
// std::string Dataset::sayReadable() const
// {
// return "Readable";
// }
//
// std::string Dataset::sayEditable() const
// {
// return "Editable";
// }
//
// std::string Dataset::sayStatistics() const
// {
// return "Statistics";
// }
//
// int main()
// {
// Dataset* dataset = new Dataset;
// cout << dataset->sayReadable() << endl;
// cout << dataset->sayEditable() << endl;
// cout << dataset->sayStatistics() << endl;
//
// cout << "==STATS==" << endl;
// IStatistics* statistics = dynamic_cast<IStatistics*>(dataset);
// cout << statistics->sayReadable() << endl;
// cout << statistics->sayStatistics() << endl;
//
// cout << "==DATASET==" << endl;
//
// IEditableDataset<IStatistics>* editable = dynamic_cast<IEditableDataset<IStatistics>*>(dataset);
// cout << (editable != 0) << endl;
// cout << editable->sayEditable() << endl;
// cout << editable->sayReadable() << endl;
// cout << editable->sayStatistics() << endl;// не-не-не, я не хочу, чтобы этот метод был видео
//
// return 0;
// }