C++ 在基类数组中使用子类方法的默认值

C++ 在基类数组中使用子类方法的默认值,c++,arrays,pointers,subclass,default-value,C++,Arrays,Pointers,Subclass,Default Value,有没有什么方法可以cout function()可以改为5吗 目前,它接受基类的默认值并运行子类的方法 但是我希望它运行子类的方法,并获取子类的默认值 类基础 { 公众: 虚int函数(inti=1){return 2;} }; 类别分组:公共基础 { 公众: int函数(inti=5)重写{return i;} }; int main() { 基准*a[2]; a[0]=新的子节点(); cout函数();//给出1 } 您的代码正在通过Basis*指针调用function(),因此它将使用B

有没有什么方法可以
cout function()可以改为5吗

目前,它接受基类的默认值并运行子类的方法

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

类基础
{
公众:
虚int函数(inti=1){return 2;}
};
类别分组:公共基础
{
公众:
int函数(inti=5)重写{return i;}
};
int main()
{
基准*a[2];
a[0]=新的子节点();
cout函数();//给出1
}

您的代码正在通过
Basis*
指针调用
function()
,因此它将使用
Basis
定义的默认值,
Sub
无法覆盖该值。通过
Sub*
指针调用
function()
将使用
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
}
类基础
{
公众:
虚int函数(){返回函数(1);}
虚int函数(inti){return 2;}
};
类别分组:公共基础
{
公众:
int function()重写{返回函数(5);}
int函数(int i)重写{return i;}
};
int main()
{
基准*a[2];
a[0]=新基();
a[1]=新的子节点();
cout函数();//给出2
cout函数();//给出5
}

太好了。默认值是由定义设置的,而不是由实现设置的,是在运行时已知的实现。由于
a[0]->function()
的定义是针对基类的,因此我以前从未考虑过它,但我可以看出这是多么出乎意料。贝特,标准中有一两个非常漂亮的段落涵盖了这种行为。这里是: