创建虚函数的纯虚函数有危险吗?



假设我们有一个抽象类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 派生,这不是问题中的代码示例实际所做的。

它似乎并不具有固有的危险性,但考虑到像 SuperDerived 这样派生自 MyBase 的类可以明确选择使用 NonEditableSuperBase 实现。

class SuperDerived : public MyBase {
public:
using NonEditableSuperBase::someMethod;
// Or, explicitly:
// int someMethod() override { return NonEditableSuperBase::someMethod(); }
};

这满足了MyBase强加的纯虚拟要求,但就像MyBase没有该要求一样。 你已经让 SuperDerived 的作者做了一些事情,但你实际上并没有阻止他们使用最终基类的实现。

最新更新