Overloads of inherited member functions

前端 未结 3 1824
故里飘歌
故里飘歌 2020-12-16 14:42

Can a class overload methods that also exist in the publicly inherited interface? It seems like this is unambiguous and useful, but compilers (VC, Intel, GCC) all complain,

相关标签:
3条回答
  • 2020-12-16 15:05

    When you declare a method in the subclass with the same name but a different signature, it actually hides the version from the parent.

    You could refer to it specifically as Bound::rebound(...) or use the using keyword.

    See here

    0 讨论(0)
  • 2020-12-16 15:09

    You can do three things:

    1. Unhide the base class method

    Add a using in the Node declaration:

    using Bound::rebound;
    void rebound() { rebound(left, right); }
    

    2. Explicitly refer to the base class method

    Use the Bound namespace:

    void rebound() { Bound::rebound(left, right); }
    

    3. Define/redefine all overloads in the derived class

    Delegate the implementation to the base class (if this is done in the header, there shouldn't be any penalty thanks to inlining):

    void rebound(const Bound *a, const Bound *b) { Bound::rebound(a, b); };
    void rebound() { rebound(left, right); }
    

    More info: https://isocpp.org/wiki/faq/strange-inheritance#overload-derived

    0 讨论(0)
  • 2020-12-16 15:19

    This is called hiding the parent member function. You can explicitly call it (by Bound::rebound(left, right) as @Ates Goral said) or you can add a using Bound::rebound in your Node class definition.

    See http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9 for more info.

    0 讨论(0)
提交回复
热议问题