重载RCPP类中继承的方法 [英] Overload inherited methods in an Rcpp class

查看:0
本文介绍了重载RCPP类中继承的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个类A,父类和子类。 B重载A中的方法。问题是,在RCPP模块中公开类B时,方法getval不会重载,尽管使用指向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,父类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

这篇关于重载RCPP类中继承的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆