c++ - 创建虚函数的纯虚函数是否危险?

标签 c++ abstract-class pure-virtual

假设我们有一个抽象类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
};

更新: 例如,在我的例子中,我想从 QAbstractTableModel 创建一些派生类Qt框架的类。为了重用一些代码,我想创建一个中间抽象类。

QAbstractTableModel <- MyAbstractModel <- MyModelA (or MyModelB ... etc).

但是,我想确保模型(MyModelA、MyModelB)重新实现 QAbstractTableModel 的一些虚函数(如::index() 函数),因为 MyAbstractModel 的一些附加方法需要特定的实现入门功能。

最佳答案

来自 ISO IEC 14882 2014 :

§ 10.4 says:

5 [ Note: An abstract class can be derived from a class that is not abstract, and a pure virtual function may override a virtual function which is not pure. —end note ]

所以完全有可能做到这一点。

用例示例:

你可以有一个基本类型,它被实现为一个具体类型(基类)。现在,对于子类型,我们可能需要进一步的附加信息。因此,我们可以有一个抽象的中间对象来满足我们的需求。

关于c++ - 创建虚函数的纯虚函数是否危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43143733/

相关文章:

c++ - c++11 严格别名规则是否允许通过 char *、char(&)[N]、甚至 std::array<char, N>& 使用 -fstrict-aliasing -Wstrict-aliasing=2 访问 uint64_t?

c++ - 确定方法是否为纯虚拟 (c++)

c++ - 完全纯虚拟类的 Vtable 放置

c++ - 纯虚函数可能没有内联定义。为什么?

c++ - std::foward 的第二次重载(cppreference.com 上的示例)

c++ - 如何在 Windows 中从 C++ 程序执行另一个 exe

c++ - 在其他类中使用抽象类的构造函数

c++ - 继承的虚拟类的C++内存布局

c++ - 具有虚拟成员 : linker error 的模板类

c# - 复杂软件中的所有控件是否都应继承自编写的界面