0

我感觉答案是不可能的,至少我在这些方面找不到任何东西,但我希望能感到惊讶:

我继承和扩展了一个由 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 和编译器中。

提前致谢。

4

2 回答 2

0

你需要能够拥有容器myCommand吗?如果不这样做,您可以通过制作myCommand模板类来获得与您正在寻找的行为相似的行为,其中模板参数将提供通常会在虚函数中进行的行为。

template <typename PreflightChecker>
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()
    {
        PreflightChecker::check();
    }
};

class MyPreflightChecker
{
public:
    static void check()
    {
        ...
    }
};

vector<MPxCommand> v;
myCommand<MyPreflightChecker> command;
v.push_back(command);
于 2013-09-20T06:06:18.650 回答
0

你可以这样做:

class A {


  virtual void method() = 0 {
    // now the derived classes HAS to implement it
    // and you still get an implementation

  }

};
于 2013-09-20T06:14:50.367 回答