c++ - 为什么重写的虚方法不能在没有显式作用域的情况下看到重载的基类版本?

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

最佳答案

对于该行为,您不需要虚拟 方法。派生类中的方法隐藏基类中同名的方法。因此,如果您的派生类中有任何名为 Expand 的函数(即使它是基类中虚方法的重写),基类中的同名方法都不可见,无论他们的签名。

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

class B : public A
{
public:
    using A::Expand;  
    virtual void Expand() { Expand(true); }
};

关于c++ - 为什么重写的虚方法不能在没有显式作用域的情况下看到重载的基类版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10214223/

相关文章:

c++ - N皇后问题。从函数C++返回数组

javascript - 在 Angular 服务中扩展基类

c++ - 函数重载和模板函数有什么区别?哪个更合适?

c++ - 字符串重载运算符 ">>"

c++ - 我如何使用 istream_iterator 将 unsigned char vector 转换为字符串?

c++ - 是否可以从基类调用派生类函数

c++ - 如何使用 va_list 解决错误?

c++ - 除了可访问性,访问说明符还有什么作用?

python - 如何在不覆盖父函数的情况下将值返回给父类(super class)?

c++ - 从封闭的模板类推导返回类型时函数解析失败