【发布时间】:2017-03-31 14:55:38
【问题描述】:
假设我们有一个抽象类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 的一些附加方法需要特定实现引物功能。
【问题讨论】:
-
这是一个足够公平的问题,但对于不处理编程风格问题的 StackOverflow 来说不是。如果你定义了一个基方法,你必须想知道发生了什么使它在中间类中无效。
-
完全有可能实现你想要的。没有什么危险的。它是否是一种好的风格是非常主观的。
-
gcc 4.9 会在 SuperDerived 的实例化时发出错误信号(假设 Derived 是 MyBase)如果 someMethod 被注释掉/未在 SuperDerived 中定义,正如@JesperJuhl 解释的那样
-
您是否打算让 MyBase 使用来自 NonEditableSuperBase 的私有继承?
-
我会在 NonEditableSuperBase 中进行虚拟保护
标签: c++ abstract-class pure-virtual