#include<stdio.h>
class A
{
public:
virtual int fun( int a=0, float f = 5.4)=0;
};
class B: public A
{
public:
int fun(int i = 0, float k= 5.4)
{
return 0;
}
int fun(int i= 8, float k = 4.5, char c = 'g')
{
if(c != 'g')
return fun(i,k);
else
return -1;
}
};
int main()
{
//fun();
return 0;
}
此程序是我的项目代码的副本。当我在fun(i,k)
中调用fun(a,b,c)
时出现编译时错误。我明白为什么我得到这个编译错误,但我找不到替代方案。请提出替代方案。
答案 0 :(得分:0)
致电fun(i,k)
不明确,因为这可能意味着您想要int fun(int i, float k)
或int fun(int i, float k, char c)
与c='g'
您可以更改其中一个功能名称来解决问题。
另一种解决方案是将它们合并到一个函数中
int fun(int i= 8, float k = 4.5, char c = 'g')
{
if(c != 'g')
//code of int fun(int i = 0, float k= 5.4)
else
return -1;
}
答案 1 :(得分:0)
切换参数,并删除一个默认值,否则你必须重命名它们。
let text = "Add \"ABC\""
let range = text.rangeOfString("(?<=\")[^\"]+", options: .RegularExpressionSearch, range: nil, locale: nil)
if let nonNilRange = range {
print(text.substringWithRange(nonNilRange))
}
答案 2 :(得分:0)
您的设计表明B将通过指针/参考A
使用,但B
中的额外重载在A
中不可见。您没有扩展基本接口,而是扩展特定的派生类接口。
无论如何你想要这样做:
如果您想要在未提供c
的情况下拨打第一个重载,则您不需要任何重载,因为您可以直接拨打fun(i,k)
。
由于具有默认值的参数需要在最后,您要么首先要使用char参数
int fun(char c, int i= 8, float k = 4.5) { return c != 'g' ? fun(i,k) : -1; }
或者您可以使用没有默认值的重载:
int fun(int i, float k, char c) { return c != 'g' ? fun(i,k) : -1; }
答案 3 :(得分:0)
以下可能会有所帮助:
class A
{
public:
virtual ~A() = default;
virtual int fun(int = 0, float = 5.4f) = 0;
};
class B: public A
{
public:
int fun(int i = 8, float k = 4.5f) override // You may change default value here
// but not recommended
{
return 0;
}
int fun(int i, float k, char c) // it is not an override
{
if(c != 'g')
return fun(i, k);
else
return -1;
}
};
所以带有0,1,2个参数的B::foo
使用覆盖方法,使用3个参数,它使用重载。
,例如
B b;
A& a = b;
a.fun(); // fun(0, 5.4)
b.fun(); // fun(8, 4.5) // That part may surprise user