为什么派生类重载函数隐藏基类函数
Why derived class overloaded function hides base class function?
请考虑以下代码:
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() 接受零参数。为什么会这样?如果函数签名在基类和派生类中匹配,我可以理解编译器隐藏基类版本,但是如果它们采用不同的参数/不同的 no,为什么编译器无法解析这两个函数。的参数?
你必须在派生类中创建函数体
void Fun()
{
}
编译时首先它将检查派生类中的函数体。
如果您没有在派生类中重载基类函数,则可以使用基类函数。
在下面的示例中,我更改了派生类的函数名称...
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 Classn");
}
};
class Derived : public Base
{
public:
void Fun()
{
Base::Fun();
}
void Fun(int x)
{
printf("Derived Classn");
}
};
int main()
{
Derived d;
d.Fun(5);
d.Fun(); // No Compilation error
}
编译错误,因为派生类中没有任何'Fun()
'。您正在使用派生类对象调用Fun()
。在 CPP 中,这称为 'method hiding'
。 为了解决派生类中的创建函数 Fun()
void Fun() { }
相关文章:
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 隐藏用于聚合初始化的空基类
- 如何隐藏模板基类的参数类型
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 在派生类接口中隐藏基类的特定函数
- 为什么基类函数没有被同名的派生类函数隐藏
- 在派生类中使用声明并不能隐藏从基类派生的相同函数
- 有没有一种聪明的方法可以禁止通过派生类之一隐藏基类的运算符函数
- 为什么继承的函数隐藏在这个代码的基类中
- 取消隐藏派生中基类中具有相同名称和不同签名的某些函数
- 使用"using"声明隐藏基类方法不适用于赋值运算符
- 从模板基类中取消隐藏模板化的强制转换运算符
- 防止重写和/或隐藏基类函数(C++11)
- SFINAEd-out 函数是否隐藏了从基类显式导入的重载
- 访问具有不同签名的基类中的隐藏函数
- 如何处理基类函数已经重载不同访问权限时的名称隐藏问题
- 名称隐藏和访问基类的非虚函数(语法)
- 隐藏基类中的所有重载方法
- 递归取消隐藏基类成员
- 为什么派生类重载函数隐藏基类函数