javascript - 从 JavaScript 中的 C++ 类继承

标签 javascript c++ inheritance v8

我在 C++ 程序中使用 V8 进行扩展。我希望能够 在 JavaScript 中创建从 C++ 中的基类“继承”的对象。 这是 C++ 中的一个简单层次结构:

class animal
{
public:
    void move();
    virtual void vocalize() = 0;
};

class cat : public animal
{
public:
    void vocalize() override;
    void ignore_owner();
};

这是用 JavaScript 而不是 C++ 实现的 cat:

function cat()
{
    this.vocalize = function() {}
    this.ignore_owner = function() {}
}

add_animal(new cat);

其中 add_animal() 是用 C++ 实现的全局函数:

void add_animal(v8::Local<v8::Object> o);

add_animal() 中,我手动添加了指向 C++ 的 move 属性 函数并确保 vocalize 属性存在并且是一个 功能。

var c = new cat;

c.ignore_owner();   // JavaScript code
c.move();           // error, undefined

add_animal(c);

c.move();           // okay, C++ code

我在网页之外的 JavaScript 方面的经验有限。这是一个 有意义的计划? add_animal() 用于两者的事实 添加“基类”属性将动物添加到列表中 对我来说违反直觉。我可以添加第二个功能:

var c = new cat;
make_animal(c);
add_animal(c);

但这需要纪律并且看起来很复杂。

我还可以公开animal,用它来创建对象并添加 cat - 之后的特定属性:

function make_cat(c)
{
    c.vocalize = function() {}
    c.ignore_owner = function() {}
}

var c = new animal;
make_cat(c);

add_animal(c);

但这对我来说很奇怪。

从 C++ 类“继承”的最佳方法是什么?

最佳答案

只需将您的基类暴露给 JavaScript(参见 the official embedder's guide 的示例),然后使用常规的 JavaScript 继承:

function Cat(name) {
  this.name = name;
}
var catproto = Cat.prototype = new Animal();
catproto.vocalize = function() { /* cat-specific override */ }
catproto.ignore_owner = function() { return true; /* :-P */ }
catproto.purr = function() { /* you can add new methods too */ }

var c = new Cat("Kitty");
c.move();  // Inherited.
c.vocalize();  // Meow.

关于javascript - 从 JavaScript 中的 C++ 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31494809/

相关文章:

javascript - Google App Script 中的子类和继承

javascript - React Hooks 模态传递状态?

c++ - 如何在cocos2d-x中创建自定义Action

c++ - 返回多个表给C++,如何知道返回的表名

c++ - 本地对象的性能改进

java - 关于Java中父类(super class)变量引用子类对象

javascript - Facebook 登录仅在 Firefox 上不起作用

javascript - 重复 Javascript 动画

javascript - JQuery Mobile - 如何设置多选的值?

c++ - 调用成员函数的拷贝构造函数