[英]Is it dangerous to create pure virtual function of a virtual function?
讓我們假設我們有一個抽象類NonEditableSuperBase
,我們從中創建另一個抽象類MyBase
。
第一類NonEditableSuperBase
具有虛函數(非純虛)。 但是,我想強制說,如果有人創建了一個派生自MyBase
的類,他/她必須為所提到的函數提供一個實現。
因此,我的想法是在MyBase
中將函數定義為純虛擬。
我的問題:鑒於它只是在NonEditableSuperBase
是虛擬的,這是一個壞主意嗎?
例:
//NonEditableSuperBase.h
class NonEditableSuperBase
{
...
public:
virtual int someMethod(); //It has an implementation, suppose {return 42;}
};
//MyBase.h
class MyBase: public NonEditableSuperBase
{
public:
explicit MyBase();
virtual ~MyBase() = default;
virtual int someMethod() = 0; //I make it pure virtual
};
//MyBase.cpp
MyBase::MyBase() : NonEditableSuperBase() { }
//Now someone creates a derived class from MyBase.
class SuperDerived : public MyBase
{
public:
explicit SuperDerived();
int someMethod(); //The user must create an implementation of the function
};
更新:作為一個例子,在我的例子中,我想從Qt框架的QAbstractTableModel類創建一些派生類。 要重用一些代碼,我想創建一個中間抽象類。
QAbstractTableModel <- MyAbstractModel <- MyModelA (or MyModelB ... etc).
但是,我想確保模型(MyModelA,MyModelB)重新實現QAbstractTableModel的一些虛函數(如:: index()函數),因為MyAbstractModel的一些額外方法需要引物函數的特定實現。
§10.4說:
5 [注意:抽象類可以從非抽象的類派生,純虛函數可以覆蓋不純的虛函數。 - 尾注]
所以完全可以做到這一點。
用例示例:
您可以擁有一個基本類型,它是作為具體類型(基類)實現的。 現在,對於子類型,我們可能需要進一步的附加信息。 因此,我們可以有一個抽象的中間對象來滿足我們的需求。
[我假設MyBase的目的是公開派生自NonEditableSuperBase,這不是問題中的代碼示例實際上做的。]
它本身並不危險,但考慮到源自MyBase的SuperDerived類可以明確選擇使用NonEditableSuperBase實現。
class SuperDerived : public MyBase {
public:
using NonEditableSuperBase::someMethod;
// Or, explicitly:
// int someMethod() override { return NonEditableSuperBase::someMethod(); }
};
這滿足了MyBase強加的純虛擬要求,但就像MyBase沒有那個要求一樣。 您已經讓SuperDerived的作者做了一些事情 ,但實際上並沒有阻止他們使用最終基類的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.