C++ pure virtual function have body

C++Pure Virtual

C++ Problem Overview


Pure virtual functions (when we set = 0) can also have a function body.

What is the use to provide a function body for pure virtual functions, if they are not going to be called at all?

C++ Solutions


Solution 1 - C++

Your assumption that pure virtual function cannot be called is absolutely incorrect. When a function is declared pure virtual, it simply means that this function cannot get called dynamically, through a virtual dispatch mechanism. Yet, this very same function can easily be called statically, non-virtually, directly (without virtual dispatch).

In C++ language a non-virtual call to a virtual function is performed when a qualified name of the function is used in the call, i.e. when the function name specified in the call has the <class name>::<function name> form.

For example

struct S 
{
  virtual void foo() = 0;
};

void S::foo() 
{
  // body for pure virtual function `S::foo`
}

struct D : S 
{
  void foo() 
  {
    S::foo();       
    // Non-virtual call to `S::foo` from derived class

    this->S::foo(); 
    // Alternative syntax to perform the same non-virtual call 
    // to `S::foo` from derived class
  }
};

int main() 
{
  D d;

  d.S::foo(); 
  // Another non-virtual call to `S::foo`
}

Solution 2 - C++

> "Effective C++" Meyers mentions a > reason for a pure virtual function to > have a body: Derived classes that > implement this pure virtual function > may call this implementation smwhere > in their code. If part of the code of > two different derived classes is > similar then it makes sense to move it > up in the hierarchy, even if the > function should be pure virtual.

see here.

Solution 3 - C++

For most pure virtual functions, you'd be right. However, for a pure virtual destructor, it's actually important to define a corresponding destructor implementation:

  • The "pure virtual" is to require derived classes to implement their destructor.
  • Your base class destructor implementation is so that the derived class destructors can successfully "chain up" afterwards.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVijayView Question on Stackoverflow
Solution 1 - C++AnTView Answer on Stackoverflow
Solution 2 - C++Prince John WesleyView Answer on Stackoverflow
Solution 3 - C++Chris Jester-YoungView Answer on Stackoverflow