这是我在这里的第一篇帖子,我找了好几天的答案,所以我问了。这是一个复杂的结构。我将SpiderMonkey javascript引擎嵌入到Illustrator插件中。插画有一个复杂的,有时不一致的API。在这种情况下,我必须调用一个以短类型作为参数的方法:
namespace ai
{
...
typedef signed short int16;
...
};该方法被称为结构中的指针:
struct AIDocumentSuite {
...
AIAPI AIErr (*GetDocumentRulerUnits) ( ai::int16 *units );
...
};但是,枚举是参数的来源:
enum AIDocumentRulerUnitValue {
kUnknownUnits = 0,
/** inches */
kInchesUnits,
/** centimeters */
kCentimetersUnits,
/** points */
kPointsUnits,
/** picas */
kPicasUnits,
/** millimeters */
kMillimetersUnits,
/** pixels */
kPixelsUnits,
/** Q units */
kQUnits
};为了让SpiderMonkey管理javascript对象,我将所有这些都封装在类中。我在代码中的某个地方有以下工作调用(稍微简化了一些,清理了测试和验证):
ai::int16 aiDocumentRulerUnitValue;
AIErr aiErr = sAIDocument->GetDocumentRulerUnits(&aiDocumentRulerUnitValue);
...
if (!jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, value))
return false;
...
jsProperty::SetProperty(cx, &obj, "value", value, true);
...我的问题是FromAIObject。
我有一个模板基类:
template<typename T> class jsBaseDataClass : public jsBaseClass
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, T* aiObj, JSObject*& obj)
{
...
return true;
}
}和派生类:
class jsAIDocumentRulerUnitValue : public jsBaseDataClass<AIDocumentRulerUnitValue>
{
public:
...
template <typename jsT> static bool FromAIObject(JSContext *cx, ai::int16* aiint16, JSObject*& obj)
{
AIDocumentRulerUnitValue aiDocumentRulerUnitValue = static_cast<AIDocumentRulerUnitValue>(*aiint16);
return jsEnumDataClass<jsBaseClass>::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);
}
...
}现在,问题是:如果我在后一篇文章中写道:
jsAIDocumentRulerUnitValue::FromAIObject<jsAIDocumentRulerUnitValue>(cx, &aiDocumentRulerUnitValue, obj);它将尝试调用派生类中的方法(参数为ai::it 16= signed )。
如果派生类中的方法不存在,则不管第二个参数的类型如何,它都将从父类调用该方法。
我希望能够根据其参数寻找合适的方法。这将使我在两个方法的每个派生类中都有一个副本(如果必要的话,或者至少有一个默认方法的副本)。
我做错了什么,或者如何使它们表现为在非静态方法中重载继承?
谢谢。
发布于 2016-01-16 09:28:47
做点这样的事。
class Base {
public:
static void method(std::string someParam);
}
class Derived : public Base {
public:
using Base::method;
static void method(int param);
}重点是使用using关键字使基类的函数可见。
发布于 2016-01-16 08:54:08
你没做错什么。你的问题看上去像是stack overflow: inheritance and method overloading的复制品
除非using XXXX,否则重载的方法会丢失。
https://stackoverflow.com/questions/34824999
复制相似问题