请考虑以下代码:
class Base
{
public:
void Fun()
{
}
};
class Derived : public Base
{
public:
void Fun(int x)
{
}
};
int main()
{
Derived d;
d.Fun(5);
d.Fun(); // Compilation error
}
在编译时,编译器抱怨没有Fun()版本接受零参数。为什么会这样?如果函数签名在Base和派生类中匹配,我可以理解编译器隐藏基类版本,但是如果编译器采用不同的参数/不同的值,为什么编译器无法解析这两个函数。参数?
答案 0 :(得分:0)
你必须在派生类
中创建函数体void Fun()
{
}
首先编译时间,它将检查派生类中的函数体。
答案 1 :(得分:0)
编译错误,因为派生类中没有任何“Fun()
”。您使用派生类对象调用Fun()
。在CPP中,这被称为'method hiding'
。要解决此问题,请在派生类
void Fun() { }
答案 2 :(得分:0)
如果没有在派生类中重载函数,可以使用基类函数。
在下面的示例中,我更改了派生类的函数名称...
class Base
{
public:
void Fun()
{
}
};
class Derived : public Base
{
public:
void Fun1(int x)
{
}
};
int main()
{
Derived d;
d.Fun1(5);
d.Fun(); // No Compilation error
}
如果要在派生类中重载函数,则必须覆盖基类函数。像这样
class Base
{
public:
void Fun()
{
printf("Base Class\n");
}
};
class Derived : public Base
{
public:
void Fun()
{
Base::Fun();
}
void Fun(int x)
{
printf("Derived Class\n");
}
};
int main()
{
Derived d;
d.Fun(5);
d.Fun(); // No Compilation error
}