Can I overload a pure virtual method in a base class?

In the example below, I have an abstract class with a pure virtual method (aka FUN1) and a regular method (aka FUN2).

#include <iostream>

class A
{
public:
        virtual void fun(int i) = 0; // FUN1
        void fun() { this->fun(123); } // FUN2
};

class B : public A
{
public:
        virtual void fun(int i) { std::cerr << i << std::endl; }
};

int main(int,char**)
{
        B b;
        b.fun();
}

Why can't I invoke FUN2 in a derived class? g ++ gives an error:

main.cpp: 19: 8: error: there is no corresponding function to call in B: fun ()


EDIT: note that the issue of Overloading a pure virtual function is different. I do not want to redefine methods.

+4
source share
2 answers

: b.fun(), fun class B, B::fun(int). A::fun().

- 10.2 [class.member.lookup]/4:

C f, f, C, , . (...) , C, .

, using , using A::fun;.

, , , b.A::fun().

+6

using A::fun; B:

#include <iostream>

class A
{
public:
    virtual void fun(int i) = 0; // FUN1
    void fun() { this->fun(123); } // FUN2
};

class B : public A
{
public:
    using A::fun;
    virtual void fun(int i) { std::cerr << i << std::endl; }
};

int main(int, char**)
{
    B b;
    b.fun();
    b.fun(5);
}
+5

All Articles