c++ - 在基类数组中使用子类方法的默认值
问题描述
有什么办法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
}
解决方案
您的代码是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
}
推荐阅读
- regex - 正则表达式转换为 Oracle 表达式 - (\b|\d)(?i)INT(\b|\d)
- javascript - if(options.includes(bestelling) == bestelling) 不起作用,我如何检查输入是否等于数组项?
- vba - 如何使用 VBA 代码设置 VSTO 变量?
- java - SQL 错误是在预期条件的上下文中指定的非布尔类型的表达式,靠近“与”
- xamarin - Xamarin.forms C# 2 引号
- python - 如何在我的项目中使用其他的代码作为模块?
- ios - 混合应用程序中的渐进式 Web 应用程序(PWA):分发挑战
- html - HTML & Bootstrap 4:动态地将卡片元素从一列移动到另一列
- ruby-on-rails - 无法在 Rails 5 中为关联模型创建记录
- python - 是否可以在 Python 中使用 Windows 样式的命令行选项?