来自func
的方法DerivedClass
会覆盖方法func
及其BaseClass
的所有重载。
#include <cstdio>
class BaseClass
{
public:
void func(int a){puts("BaseClass::func(int)");};
void func(int a, int b){puts("BaseClass::func(int, int)");};
void func(int a, int b, int c){puts("BaseClass::func(int, int, int)");};
//...
};
class DerivedClass : public BaseClass
{
public:
void func(int a){puts("DerivedClass::func(int)");}
//...
};
int main()
{
DerivedClass obj;
obj.func(0);
obj.func(0, 0); // error
obj.func(0, 0, 0); // error
return 0;
}
如何修复此代码以在屏幕上结束:
DerivedClass::func(int)
BaseClass::func(int, int)
BaseClass::func(int, int, int)
修改1
在函数main
中不应该改变任何东西
答案 0 :(得分:5)
派生类的成员函数不会覆盖基类,它隐藏它们。要将它们全部扩展到范围,请使用using
声明:
class DerivedClass : public BaseClass
{
public:
void func(int a){puts("DerivedClass::func(int)");}
using BaseClass::func;
//...
};
答案 1 :(得分:2)
这是设计:这种现象被称为“名字隐藏”。
[简短回答]:
C ++不喜欢这样的想法,即在一个子类中调用一个具有一组特定参数的基函数的长期行为,并选择隐藏每个基类中的所有重载< / strong>解决这个问题。
[长答案]此处: https://stackoverflow.com/a/1629074/1938163
作为一种解决方法,你可以将对象强制转换为适当的基础并调用你需要的函数(虽然有一个强制转换惩罚),或者通过指定它的基类直接调用你需要的函数
int main()
{
DerivedClass obj;
obj.func(0);
obj.BaseClass::func(0,0);
return 0;
}
或者您可以使用“using directive”
取消隐藏它们class DerivedClass : public BaseClass
{
public:
void func(int a){puts("DerivedClass::func(int)");}
using BaseClass::func;
//...
};