1

I just noticed that I could have an implementation of a pure virtual function in the abstract class itself. GCC doesn't complain. Is there any use of such implementation? Can anybody use it?

class AbstractClass
{
    virtual void PureVirtualFunction() = 0;
};

void AbstractClass::PureVirtualFunction() //Is there any use of this implementation?
{
    cout << "I am inside pure virtual function of AbstractClass" << endl;
}

class DerivedClass : public AbstractClass
{
    public:
        void PureVirtualFunction();
};

void DerivedClass::PureVirtualFunction()
{
    cout << "I am inside pure virtual function of DerivedClass" << endl;
}
ontherocks
  • 1,747
  • 5
  • 26
  • 43

2 Answers2

4

You can use it to provide a default implementation which is accessible to derived classes.

One possible use is "Dear derived class authors, this virtual function is very important and I want to be sure that you know what you're doing with it. I will provide a default implementation, but you must use it explicitly." This would be done like this:

class AbstractClass
{
public:
    virtual void PureVirtualFunction() = 0;
};

void AbstractClass::PureVirtualFunction() //Is there any use of this implementation?
{
    cout << "I am inside pure virtual function of AbstractClass" << endl;
}

class DerivedClass : public AbstractClass
{
    public:
        void PureVirtualFunction();
};

void DerivedClass::PureVirtualFunction()
{
    AbstractClass::PureVirtualFunction();
}
Angew is no longer proud of SO
  • 167,307
  • 17
  • 350
  • 455
1

You can call it from DerivedClass implementation for example (if AbstractClass::PureVirtualFunction is not private):

void DerivedClass::PureVirtualFunction()
{
    AbstractClass::PureVirtualFunction();
    cout << "I am inside pure virtual function of DerivedClass" << endl;
}

Or even if it's private you can call it from AbstractClass itself:

class AbstractClass
{
    virtual void PureVirtualFunction() = 0;

public:
    void CallPureVirtualFunction() {
        AbstractClass::PureVirtualFunction();
    }
};

DerivedClass().CallPureVirtualFunction();

I am inside pure virtual function of AbstractClass
Anton Savin
  • 40,838
  • 8
  • 54
  • 90