Вы должны создать класс C ++, который реализует вашу чисто виртуальную функцию, а затем вызывает код Lua. Реализация была бы слишком сложной, чтобы просто добавить сюда.
Базовый псевдокод:
// C++
struct LuaA : public A
{
LuaA(const std::string &luacode)
: myLuaHandler(luacode)
{
}
virtual void foo()
{
myLuaHandler.call("MyA:foo()");
}
}
Этот пример очень высокого уровня, но он призван показать, что то, что вы хотите сделать, нетривиально. Это новый "LuaA", который вы бы хотели использовать в своем коде Lua.
В целом, я предпочитаю использовать SWIG при упаковке C ++ для ознакомления с Lua и другими скриптовыми языками. SWIG поддерживает эту перегрузку интересующих вас виртуальных методов (называемых на языке SWIG «директорами»), однако следует отметить, что Lua / SWIG не поддерживает директоров. Java, C #, Ruby, Perl и Python имеют поддержку директоров в SWIG. Я не знаю точно, почему это не поддерживается в Lua.
Возможно, поскольку Lua не поддерживает наследование, точная семантика того, что вы хотели бы достичь, просто невозможна в том виде, в котором вы предлагаете.
Возможно, у кого-то есть лучший ответ на Lua?