【问题标题】:Why are function overloads of base classes inaccessible [duplicate]为什么基类的函数重载无法访问[重复]
【发布时间】:2018-04-17 12:27:48
【问题描述】:

考虑以下示例:

struct Base
{
    void foo()
    {
        cout << "Base foo\n";
    }

    void bar()
    {
        cout << "Base bar\n";
    }
};

struct Derivate : public Base
{
    void foo(int x)
    {
        cout << "Derivate foo\n";
    }
};

如果我们创建两个实例,比如

Base a;
Derivate b;

Base 对象 a 可以照常调用其成员函数 (a.foo(); a.bar();)。

使用b 时,调用b.bar() 可以正常工作,但由于我重载了Base::foo(),因此无法调用b.foo()

为什么会这样?

【问题讨论】:

标签: c++ inheritance overloading c++17


【解决方案1】:

你没有超载Base::foo,而是你隐藏了它。而且还是可以访问的,可以这样调用:

static_cast<Base &>(b).foo();

【讨论】:

  • 我没有投反对票,但我猜是谁投了反对票,因为你混淆了“过载”和覆盖。显示的内容确实超载。在基础中需要一个虚函数是覆盖的。
  • Base::foo 确实被Derivate::foo重载(也隐藏)。它是虚拟的这一事实防止它被覆盖,而不是重载。虽然提供的解决方法确实有效,但 using 声明将是一个更清洁的解决方案。
  • @Angew 没有被重载,因为它根本不参与重载解析(除非使用using Base::foo;)。
  • 你说得对,我误会了过载位。
猜你喜欢
  • 2017-12-16
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2016-07-06
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多