重载RCPP类中继承的方法

2022-07-21 00:00:00 c++ 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

相关文章