【问题标题】:Is it possible to unhide only specific overloaded method of Base class是否可以仅取消隐藏基类的特定重载方法
【发布时间】:2020-05-21 22:37:43
【问题描述】:
#include <iostream>

class B
{
    public:
    virtual void f() {std::cout<<"Fi";}
    virtual void f(int) {std::cout<<"GI";}

};
class A : public B
{
    public:
    void f(double) {std::cout<<"HI";}   
    using B::f;//but I want to use only f(), not f(int)
};

int main () {
  A a;
  a.f();
  a.f(10);

  return 0;
}

是否可以在派生类 A 中仅取消隐藏 f() 重载?所以 a.f(10);会调用 A::f(double)

【问题讨论】:

  • 顺便说一句,我不会将此设置与公共继承一起使用,尽管将继承设为私有不会改变问题

标签: c++ polymorphism overloading


【解决方案1】:

您可以将 using 语句替换为调用基类方法的函数:

void f() { B::f(); }

【讨论】:

  • 我想知道也许使用 using 语句是可能的,但似乎不是
【解决方案2】:

对于您所尝试的,使A 使用protectedprivate 继承,以便B 的方法不是A 中的public。然后A 可以声明自己的方法,在内部调用B 的方法。

#include <iostream>

class B
{
public:
    virtual void f() {std::cout<<"Fi";}
    virtual void f(int) {std::cout<<"GI";}
};

class A : protected B
{
public:
    void f(double) {std::cout<<"HI";}   
    void f() { B::f(); }
};

int main () {
  A a;
  a.f();
  a.f(10);

  return 0;
}

输出:

FiHI

Live Demo

【讨论】:

  • @ALX23z 不,它没有。正如您在我链接到的演示中看到的那样,代码运行良好。当派生类重写方法调用它重写的基类虚拟方法时,虚拟调度不会再次调用派生方法。
  • 对不起,你是对的。不知道 B::f() 会显式调用 B 的版本,即使它被覆盖。虚函数非常具有误导性。
  • 由于 A::f(double) 隐藏了所有 B::f 方法,对于我的问题,使用哪种继承并不重要。您的代码与 A 类的工作方式完全相同:public B
猜你喜欢
  • 2013-03-30
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多