C++ 授权派生函数的实现,而不使其纯粹
我觉得答案是不可能的,至少在这些方面我找不到任何东西,但我希望能感到惊讶: 我继承并扩展了一个API提供的类,该扩展从以前继承上述基础的各种派生类继承了很多。 即: API提供了数据库。 用户通常会实现C++ 授权派生函数的实现,而不使其纯粹,c++,virtual,maya,C++,Virtual,Maya,我觉得答案是不可能的,至少在这些方面我找不到任何东西,但我希望能感到惊讶: 我继承并扩展了一个API提供的类,该扩展从以前继承上述基础的各种派生类继承了很多。 即: API提供了数据库。 用户通常会实现类myCommand:public theirBase{} 我把类extendedBase:public theirBase{}将被继承 这是因为我想删除重复出现的模式(纯锅炉板),以及一些重复出现的步骤,这些步骤需要特定的实现,我想明确强制执行。 如果您熟悉Autodesk Maya,我已经扩展
类myCommand:public theirBase{}代码>
我把类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
};
class A {
virtual void method() = 0 {
// now the derived classes HAS to implement it
// and you still get an implementation
}
};
class myCommand:公共MPxCommand{
公众:
myCommand(){};
虚拟~myCommand(){};
静态void*creator(){返回新的myCommand;}//您需要能够拥有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);
模板
类myCommand:公共MPxCommand{
公众:
myCommand(){};
虚拟~myCommand(){};
静态void*creator(){return new myCommand;}/您可以这样做:
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
};
class A {
virtual void method() = 0 {
// now the derived classes HAS to implement it
// and you still get an implementation
}
};
感谢您的回复,但除非我遗漏了一些纯虚拟的内容,这意味着您将无法使用new分配实例,这是API的一个遗憾的要求。@the_JacO you right.对不起,我认为您仍然可以实例化该类的一个实例。这可能会给注册器带来麻烦(可能会),并且对于采用该类的人来说有点太陌生了,他们可能希望该类的行为和处理方式与原始类禁止扩展和一些简单的附加指令的方式相同。但是可能仍然值得修补。感谢您的建议。与其使用派生类来消除样板文件,您可以o通过提供一个宏来实现。这并不能完全消除样板文件,因为用户仍然需要包含宏,但它可以大幅减少。难道不能有一个CommandBase类继承自MPxCommand,并包含纯虚拟preflightCheck()定义吗?定义“不可创建”是完全有效的MPxCommand的派生,并且只有一个用于实际实现类的creator函数。此外,我不认为creator函数甚至需要是它创建的类的成员-它只需要在使用Maya API调用注册函数时全局可访问