Под дополнительной функциональностью я подразумевал манипуляции с самим абстрактным вью, который потом должен превратится в конкрентую реализацию либо QTableView либо QTreeView.
Это требует доступ к протектед интерфейсу QAbstractItemView.
То, что предлагает Igors, называется "декоратор" (паттерн такой). Он вам не подходит, поскольку позволяет декорировать только паблик интерфейс QAbstractItemView.
Вот это
//NOTE: T is some Q...View class
template<typename T>
class myMegaView:public T{
//some shared code
называется миксином (mixin - подмешиваемая функциональность) и основывается на одной из форм CRTP (идиома C++ такая, см.
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern).
Оно будет работать.
Достоинство - есть доступ к протектед интерфейсу.
Недостатки: 1. инстанцирование под каждый наследуемый тип, т.е. раздувание объектного кода (несущественный недостаток), 2. не будет отдельного интерфейса, который соответствует подмешанной функциональности (существенный недостаток, если такой интерфейс требуется); данный недостаток устраняется, путем создания интерфейса и наследования от него, имплементацию интерфейса делает миксин.
Вариант от kambala (класс Common).
Достоинства/недостатки - инверсия предудущего варианта.
Все хорошо пока вам в собственном методе data() не придется использовать методы QAbstractItemView.
Если из класса Common нужно обращение к паблик интерфейсу QAbstractItemView, то делается кросскаст.
class Common
{
public:
QVariant data(const QModelIndex &index, int role) const
{
QAbstractItemView* thisAsQAbstractItemView = dynamic_cast<QAbstractItemView*>(this);
thisAsQAbstractItemView->someMethod(...);
}
};
В частности, кросскастом из Common к QObject можем выбросить любой сигнал из Common (разумеется, окончательный класс должен иметь такой сигнал):
void Common::setSomeProperty(int value)
{
if (value_ == value) return;
value_ = value;
QObject* object = dynamic_cast<QObject*>(this); // crosscast
Q_ASSERT(object && "dynamic_cast<QObject*>(this)");
bool ok = QMetaObject::invokeMethod(object, "somePropertyChanged", Qt::DirectConnection,
QGenericReturnArgument(), Q_ARG(int, value));
Q_ASSERT(ok);
Q_UNUSED(ok);
}
Опять таки, в данном варианте нет доступа к протектед интерфейсу QAbstractItemView.