为什么不能覆盖虚方法看不到重载基类版本而没有显式范围?

时间:2012-04-18 16:57:45

标签: c++ inheritance overloading

我不明白为什么编译器不喜欢这个,这里是问题的例子:

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个参数

2 个答案:

答案 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);
    }
};