在 Rcpp 中重载继承的方法 class

Overload inherited methods in an Rcpp class

我有两个 classes A,parent 和 B,child。 B 重载了 A 中的一个方法。问题是方法 getval 在 RCPP 模块中公开 class B 时没有重载,尽管第二次显式公开它并指向 B::getval.

这是由于 Rcpp 中的错误、限制还是我还不知道的原因?

class A
{
public:
    A(int val) : val(val) {}

        int getval()
        {
                Rcout << "I am A" << endl;
                return val;
        }

private:
    int val;
};

class B : public A
{
public:
        using A::A;

        int getval()
        {
                Rcout << "I am B" << endl;
                return A::getval();
        }
};

RCPP_MODULE(rg)
{
    using namespace Rcpp;

    class_<A>("A")
        .constructor<int>()
        .method("getval", &A::getval);

    class_<B>("B")
        .derives<A>("A")
        .constructor<int>()
        .method("getval", &B::getval);
}

如果我在一个简单的 C++ 程序中使用我上面的基本示例(在问题中)如下:

int main()                                                                                                                                                                                   
{                                                                                                                                                                                            
    A a(42);                                                                                                                                                                                  
    B b(43);                                                                                                                                                                                  
                                                                                                                                                                                      
    cout << a.getval() << endl;                                                                                                              
    cout << b.getval() << endl;                                                                                            
}

将使用正确的方法。但是,对于 Rcpp,父 class A 必须将方法 getval 声明为 virtual:

virtual int getval()

事实上,在 B 中声明与 virtual 相同的方法也很好。在R,终于可以正常工作了:

a <- A$new(42)
b <- B$new(43)

然后:

a$getval()
I am A
[1] 42

b$getval()
I am B
I am A
[1] 43

请注意 I am B 下的消息 I am A 是预期的,因为在我的示例中我明确调用了 A::getval.