Можно ли обойтись без виртуального наследования?
Если классы, названия которых начинаются с «I» — это интерфейсы, то есть у них нет своих данных и логики, то такое множественное наследование не считается моветоном.
Но, возможно, в вашем случае можно IEditableDataset переименовать в IWritableDataset и не наследовать его от IReadableDataSet.
еквивалент на шаблонах например такой, только не сильно красиво… 
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;
}
