3

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

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

4

2 回答 2

4

您不需要virtual该行为的方法。派生类中的方法隐藏基类中同名的方法。因此,如果您在派生类中命名了任何函数Expand(即使它是基类中虚拟方法的覆盖),则无论其签名如何,都不会看到具有相同名称的基类方法。

您可以使用 使基类方法可见using。为此,您将添加using A::Expand;到 的定义中B

class B : public A
{
public:
    using A::Expand;  
    virtual void Expand() { Expand(true); }
};
于 2012-04-18T16:59:50.037 回答
3

那是因为除了覆盖 base 之外Expand(),您还隐藏了 base Expand(bool)

当您在派生类中引入与基类中的方法同名的成员函数时,所有具有该名称的基类方法都隐藏在派生类中。

您可以通过限定(如您所愿)或使用using指令来解决此问题:

class B : public A
{
public:
    using A::Expand;
    virtual void Expand() {
        A::Expand(true);
        Expand(true);
    }
};
于 2012-04-18T16:58:47.250 回答