我不明白为什么编译器不喜欢这个,这里是问题的例子:
class A
{
public:
virtual void Expand() { }
virtual void Expand(bool flag) { }
};
class B : public A
{
public:
virtual void Expand() {
A::Expand(true);
Expand(true);
}
};
当我尝试编译它时,A::Expand(true);
编译正常,但非作用域Expand(true);
得到此编译器错误:
'B :: Expand':函数不带1个参数
答案 0 :(得分:4)
对于该行为,您不需要virtual
个方法。基类中具有相同名称的派生类隐藏方法中的方法。因此,如果在派生类中有任何名为Expand
的函数(即使它是基类中的虚方法的覆盖),则无论其签名如何,都不会显示具有相同名称的基类方法
您可以使用using
使基类方法可见。为此,您可以将using A::Expand;
添加到B
:
class B : public A
{
public:
using A::Expand;
virtual void Expand() { Expand(true); }
};
答案 1 :(得分:3)
那是因为除了覆盖基础Expand()
之外,您还隐藏基础Expand(bool)
。
当您在派生类中引入一个成员函数,其名称与基类中的方法同名时,具有该名称的所有基类方法都隐藏在派生类中。
您可以通过限定(如您所拥有)或使用using
指令来解决此问题:
class B : public A
{
public:
using A::Expand;
virtual void Expand() {
A::Expand(true);
Expand(true);
}
};