2012-04-09 104 views
1

如果我要繼承一個類,我是否必須定義它的所有虛擬和純虛函數?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; 
+0

http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation - 是的,你將不得不在你的派生類中定義純虛函數,如果該類將被實例化。 'QAbstractItemModel'不提供'index'或'parent'的定義,所以你需要提供你自己的。如果它提供了實現,你可以從你的子類調用基類的版本。 – birryree 2012-04-09 20:49:04

+0

http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation – 2012-04-09 20:52:49

+0

[C++ Virtual/Pure Virtual Explained]的可能重複(http://stackoverflow.com/questions/1306778/c-virtual - 純虛擬解釋) – 2012-04-09 20:53:31

回答

2

是。將方法聲明爲純虛擬('= 0')意味着任何具體的子類(可以實例化)都必須實現它們。

3

您不必在派生類中都實現什麼,但派生類仍然是抽象的,如果你留下任何的純虛成員函數沒有實現(換句話說,你贏了無法實例化該類的對象)。

編輯: 別的東西要考慮 - 如果你的基類,包含你的派生類不想純虛函數/需要,也許值得考慮的替代設計?也許使用聲明接口不同部分的多個基類。

如果index()parent()並不適用於所有的QAbstractItemModel派生類的話,我要說的這些功能有可能不屬於QAbstractItemModel真正

+1

我已經看到它派生類被故意遺漏在基類中的位置,因爲規範已更改並創建了新類。雖然您可以在過期的派生類上調用基類函數,但它不起作用。這完全取決於您的整體設計。這並不壞,只是不理想。 – 2012-04-09 20:57:13