Я использую SWIG, чтобы обернуть скрипт Ruby вокруг библиотеки C ++. В Ruby я могу наследовать от класса C ++, но не могу передать полученный указатель на функцию C ++ полиморфным способом.
Вот конкретный пример. Файл интерфейса SWIG определяет базовый класс Animal со звуком виртуальной функции ():
[animals.i]
%module(directors="1") animals
%{
#include "animals.h"
%}
// Apply the 'director' feature to a virtual function,
// so that we can override it in Ruby.
%feature("director") Animal::sound;
class Animal {
public:
Animal();
virtual ~Animal();
virtual void sound();
};
class Dog : public Animal {
public:
Dog();
virtual ~Dog();
virtual void sound();
};
// This function takes an Animal* and calls its virtual function sound().
void kick(Animal*, int);
Обратите внимание, что я использую директоры SWIG для межъязыкового полиморфизма, но это, похоже, не работает. Скрипт Ruby выглядит так:
[tst.rb]
require 'animals'
include Animals
dog= Dog.new # Instantiate C++ class
kick(dog, 3) # Kick the dog 3 times => It barks 3 times.
# So far so good.
class Cat < Animal # Inherit from a C++ class
def initialize
puts "Creating new cat"
end
def sound
puts "Meow"
end
end
cat= Cat.new # Instantiate Ruby class
kick(cat, 9) # This does not fly.
Последняя строка в скрипте выдает эту ошибку:
Expected argument 0 of type Animal *, but got Cat #<Cat:0xb7d621c8>
Так что, так или иначе, SWIG не позволяет мне рассматривать объект Ruby как указатель на Animal. Есть идеи?