在 Base class 数组中使用 Subclass 方法的默认值
Use default value of Subclass method in an array of Base class
有什么方法可以让 cout << a[0]->function();
改成 5?
目前,它采用基class和运行子方法的默认值class。
但是我想要运行subclass的方法,取subclass的默认值。
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
}
您的代码通过 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
}
有什么方法可以让 cout << a[0]->function();
改成 5?
目前,它采用基class和运行子方法的默认值class。
但是我想要运行subclass的方法,取subclass的默认值。
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
}
您的代码通过 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
}