C ++ - Наследование реализации виртуальной функции

Если я должен унаследовать от класса, нужно ли мне определять все его виртуальные и чисто виртуальные функции?

Например, у меня есть производный класс, наследующий от QAbstractItemModel. QAbstractItemModel имеет следующие чистые виртуальные функции. Если мой производный класс не будет использовать методы index() и parent(), нужно ли мне его реализовать?

//qabstractitemmodel.h
virtual QModelIndex index(int row, int column,
                              const QModelIndex &parent = QModelIndex()) const = 0;
virtual QModelIndex parent(const QModelIndex &child) const = 0;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;

person Jon    schedule 09.04.2012    source источник
comment
stackoverflow.com/questions/2089083/ - да, вам нужно будет определить чистые виртуальные функции в производном классе, если этот класс будет создан. QAbstractItemModel не содержит определений index или parent, поэтому вам нужно будет указать свое собственное. Если бы он поставлял реализации, вы могли бы вызвать версию базового класса из своего подкласса.   -  person wkl    schedule 10.04.2012
comment
stackoverflow.com/questions/2089083/   -  person    schedule 10.04.2012
comment
возможный дубликат C ++ Virtual / Pure Virtual Explained   -  person    schedule 10.04.2012
comment
stackoverflow.com/questions/2652198/   -  person    schedule 10.04.2012
comment
stackoverflow.com/ questions / 2609299 /   -  person    schedule 10.04.2012


Ответы (2)


да. Объявление метода как чисто виртуального ('= 0') означает, что любой конкретный подкласс (который может быть создан) должен реализовать их.

person Asaf    schedule 09.04.2012

Вам не нужно вообще ничего реализовывать в производном классе, но этот производный класс по-прежнему будет абстрактным, если вы оставите какую-либо из чистых виртуальных функций-членов без реализации (другими словами, вы не сможете создать экземпляр объект этого класса).

Изменить: Есть еще кое-что, что следует учесть. Если ваш базовый класс содержит чистые виртуальные функции, которые не нужны / не нужны вашим производным классам, возможно, стоит поискать альтернативный дизайн? Возможно использование нескольких базовых классов, объявляющих разные части интерфейсов.

Если index() и parent() не применяются ко всем производным классам QAbstractItemModel, тогда я бы сказал, что эти функции, возможно, действительно не принадлежат QAbstractItemModel

person Ben Cottrell    schedule 09.04.2012
comment
Я видел это, когда производный класс был намеренно оставлен устаревшим вместе с базовым классом, потому что спецификация была изменена и были созданы новые классы. Хотя вы могли вызвать функцию базового класса для устаревшего производного класса, это не повлияло. Все зависит от вашего общего дизайна. Это неплохо, просто не идеально. - person ; 10.04.2012