在基类数组中使用Subclass方法的默认值

问题描述

myfunc = function(x){ initial_result = rlang::with_handlers( .expr = x + 1,error = ~ rlang::abort(c("you did it wrong",x = "`x` should be a number",i = "For example: `x = 2`"))) final_result = initial_result + 1 return(final_result) } > myfunc(a) Error: you did it wrong x `x` should be a number i For example: `x = 2` Run `rlang::last_error()` to see where the error occurred. 可以代替5吗?

此刻,它采用基类的认值并运行子类的方法

但是我希望它运行子类的方法并采用子类的认值。

cout << a[0]->function();

解决方法

您的代码正在通过function()指针调用Basis*,因此它将使用Basis定义的默认值,Sub无法覆盖那。通过function()指针调用Sub*将使用Sub定义的默认值。

因此,考虑到您所显示的代码,我想到要执行的操作的最简单方法就是使用函数重载,例如:

class Basis
{
public:
    virtual int function() { return function(1); }
    virtual int function(int i) { return 2; }
};

class Sub : public Basis
{
public:
    int function() override { return function(5); }
    int function(int i) override { return i; }
};

int main()
{
    Basis* a[2];
    a[0] = new Basis();
    a[1] = new Sub();
    cout << a[0]->function(); //gives 2
    cout << a[1]->function(); //gives 5
}