首页 > 解决方案 > 在基类数组中使用子类方法的默认值

问题描述

有什么办法cout << a[0]->function();可以给5分吗?

目前,它采用基类的默认值并运行子类的方法。

但我希望它运行子类的方法并取子类的默认值。

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

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

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

标签: c++arrayspointerssubclassdefault-value

解决方案


您的代码是function()通过Basis*指针调用的,因此它将使用由 定义的默认值BasisSub无法覆盖它。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
}

推荐阅读