簡體   English   中英

創建虛擬函數的純虛函數是危險的嗎?

[英]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的一些額外方法需要引物函數的特定實現。

來自ISO IEC 14882 2014

§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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM