Skip to main content
changed into an abstract class with pure virtual function
Source Link
Ben Cottrell
  • 12.1k
  • 4
  • 33
  • 44

It's perfectly reasonable, and sometimes desirable to have non-virtual methods in an abstract base class; just because it's an abstract class doesn't necessarily mean every part of it should be usable polymorphically.

For example, you might want to use the 'Non virtual polymorphism' idiom, whereby a function is called polymorphically from a non-virtual member function, in order to ensure that certain preconditions or postconditions are met before the virtual function is called

class MyAbstractBaseClass
{
protected:
    virtual void OverrideMe(); = 0;
public:
    void CallMeFirst();

    void CallMe()
    {
        CallMeFirst();
        OverrideMe();
    }
};

It's perfectly reasonable, and sometimes desirable to have non-virtual methods in an abstract base class; just because it's an abstract class doesn't necessarily mean every part of it should be usable polymorphically.

For example, you might want to use the 'Non virtual polymorphism' idiom, whereby a function is called polymorphically from a non-virtual member function, in order to ensure that certain preconditions or postconditions are met before the virtual function is called

class MyAbstractBaseClass
{
protected:
    virtual void OverrideMe();
public:
    void CallMeFirst();

    void CallMe()
    {
        CallMeFirst();
        OverrideMe();
    }
};

It's perfectly reasonable, and sometimes desirable to have non-virtual methods in an abstract base class; just because it's an abstract class doesn't necessarily mean every part of it should be usable polymorphically.

For example, you might want to use the 'Non virtual polymorphism' idiom, whereby a function is called polymorphically from a non-virtual member function, in order to ensure that certain preconditions or postconditions are met before the virtual function is called

class MyAbstractBaseClass
{
protected:
    virtual void OverrideMe() = 0;
public:
    void CallMeFirst();

    void CallMe()
    {
        CallMeFirst();
        OverrideMe();
    }
};
Source Link
Ben Cottrell
  • 12.1k
  • 4
  • 33
  • 44

It's perfectly reasonable, and sometimes desirable to have non-virtual methods in an abstract base class; just because it's an abstract class doesn't necessarily mean every part of it should be usable polymorphically.

For example, you might want to use the 'Non virtual polymorphism' idiom, whereby a function is called polymorphically from a non-virtual member function, in order to ensure that certain preconditions or postconditions are met before the virtual function is called

class MyAbstractBaseClass
{
protected:
    virtual void OverrideMe();
public:
    void CallMeFirst();

    void CallMe()
    {
        CallMeFirst();
        OverrideMe();
    }
};