我感觉答案是不可能的,至少我在这些方面找不到任何东西,但我希望能感到惊讶:
我继承和扩展了一个由 API 提供的类,扩展又从以前继承上述基础的各种派生类继承了很多。IE:API 提供theirBase
. 用户通常会实现class myCommand: public theirBase{};
我已经放在一起来class extendedBase: public theirBase{};
继承。
那是因为我想删除重复出现的模式(纯样板),以及一些需要特定实施的重复步骤,我想明确强制执行。如果您熟悉 Autodesk Maya,它是我扩展的 MPxCommand。
通常让它们成为纯虚拟就可以了,这正是我所追求的功能,但有一个问题,API 需要注册的命令实现回调样式静态:
static void *creator() {return new myClass;}
所以显然没有纯虚拟。
一个基本的派生和功能命令(或一个从我自己的 MPxCommand 专业超级派生的命令)看起来像这样:
class myCommand: public MPxCommand{
public:
myCommand(){};
virtual ~myCommand(){};
static void *creator(){ return new myCommand;} // <-- prevents pure virtual
static MSyntax syntax // M* are provided API objects/types
virtual MStatus doIt(const MArgList&);
virtual MStatus redoIt();
virtual MStatus undoIt();
protected:
boilerPlate();
virtual preflightCheck(){} // <- this I'd love to make pure, currently just warns
// currently it just warns about missing implementation
// as it should never be visible from a derived class
// and this class is purely a base
};
目前我在继承和扩展它时没有任何问题,但我希望在进一步的子系统(每个子系统各不相同)中明确和强制实施的方法只能是虚拟的和非纯的(我提供带有警告如果他们被调用,指向一个未实现的派生),因此不能确保未来的用户会知道他必须在不查看源中的评论或 doco 在某处丢失或在日志中捕获我的警告的情况下实现它们,更不用说我自己的愚蠢没有编译时保护。
有没有办法让我强制执行其他方法,这些方法显然不是纯虚拟的?或者以某种方式重新具体化类的某些部分,以便尽管静态创建者需要新的,但纯虚拟将被异常接受?
GCC 4.1.2,所以我也与许多 C++11 细节(覆盖等)隔绝了,但为了我自己的教育,我很乐意接受可能期待我获胜的那一天的答案t 被锁定在侏罗纪 API 和编译器中。
提前致谢。