C++: Overriding virtual pure function derived from a template class

Joseph Garnier

I wrote some classes based on this excellent visitor pattern described here (my implementation is a little bit different).

template<typename... Types>
class Visitable {
public:
     virtual void accept(Visitor<Types...>& visitor) = 0;
};

class MyClass : public Visitable<int, string>
{
     virtual void accept(Visitor<int, string>& visitor)
     {
          /*** my code ***/
     }
};

This code above works but I would like implement MyClass like that:

class MyClass : public Visitable<int, string>
{
      template<typename... Types>
      virtual void accept(Visitor<Types...>& visitor)
      {
              /*** my code ***/
      }
};

Obviously I changed the call to the accept method but I have this error: "cannot instantiate abstract class". Why in this second case, accept() is not overridden ? MyClass should be templated ?

Thanks.

Yakk - Adam Nevraumont

Use the CRTP:

template<class D, class...Ts>
struct Visitable_CRTP : public Visitable<Ts...> {
  virtual void accept(Visitor<Ts...>& visitor) override final {
    return static_cast<D*>(this)->accept_impl(visitor);
  }
};
class MyClass : public Visitable_CRTP<MyClass, int, string>
{
  template<typename... Types>
  void accept_impl(Visitor<Types...>& visitor) // not virtual
  {
          /*** my code ***/
  }
};

Visitor_CRTP writes the glue code that attaches virtual accept to your template accept_impl.

If you want to have more than one accept method, we can do this:

template<class D, class...Visitables>
struct PolyVisitable_CRTP {};

template<class D, class...V0, class...Vs>
struct PolyVisitable_CRTP<D, Visitable<V0...>, Vs...>
  Visitable_CRTP<D, V0...>,
  PolyVisitable_CRTP<D, Vs...>
{};

which can be used like this:

class MyClass :
  public PolyVisitable_CRTP<MyClass,
    Visitable<int,double>,
    Visitable<std::string, char, wchar_t>,
    Visitable<>
  >
{
  template<typename... Types>
  void accept_impl(Visitor<Types...>& visitor)
  {
          /*** my code ***/
  }
};

and all of the Visitable bases's accepts will be routed to accept_impl.

Code not tested or compiled, probably contains tpyos.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Override pure virtual function from derived template class

From Dev

Overriding C++ template function in derived class

From Dev

Overriding Pure Virtual Functions from a Template Base Class

From Dev

Overriding << operator in C++11, pure virtual in base class and different implementations in each derived class

From Dev

Avoiding "Pure Virtual Function Call" in Derived Class C++

From Dev

Reimplement a virtual function from base class in a derived template class

From Dev

Overriding a pure virtual function from templated classes

From Dev

C++: Correctly overriding virtual function in template class

From Dev

C++: Correctly overriding virtual function in template class

From Dev

C++ syntax of template class with pure virtual function?

From Dev

Virtual function implemented as template in derived class

From Dev

Declaring pure virtual function in base class with derived class object as arguments

From Dev

Declaring pure virtual function in base class with derived class object as arguments

From Dev

accessing non-template base class virtual function from template derived class

From Dev

Deriving from pure virtual template class

From Dev

C++ class template or pure virtual

From Dev

Derived classes not using all pure virtual methods from the base class

From Dev

Delete virtual function from a derived class

From Dev

Calling virtual method of base template from derived variadic template class

From Dev

Is there a tricky way to avoid overriding all pure virtual functions of template base class, used in multiple inheritance

From Java

Is it valid to "hide" a base class virtual function by making it pure virtual in derived classes?

From Dev

C++: call pure virtual function from member function of same class

From Dev

Accessing virtual base class function from a derived class

From Dev

C++ templates: Calling member function of derived template class from base class

From Dev

Class with implementation of pure virtual function

From Dev

Calling a pure virtual function from base class that doesn't define it?

From Dev

How to return a generic derived class from a virtual function?

From Dev

C++ Abstract Base Class with pure virtual operator+ function

From Dev

use of pure virtual function defined outside the class in C++?

Related Related

  1. 1

    Override pure virtual function from derived template class

  2. 2

    Overriding C++ template function in derived class

  3. 3

    Overriding Pure Virtual Functions from a Template Base Class

  4. 4

    Overriding << operator in C++11, pure virtual in base class and different implementations in each derived class

  5. 5

    Avoiding "Pure Virtual Function Call" in Derived Class C++

  6. 6

    Reimplement a virtual function from base class in a derived template class

  7. 7

    Overriding a pure virtual function from templated classes

  8. 8

    C++: Correctly overriding virtual function in template class

  9. 9

    C++: Correctly overriding virtual function in template class

  10. 10

    C++ syntax of template class with pure virtual function?

  11. 11

    Virtual function implemented as template in derived class

  12. 12

    Declaring pure virtual function in base class with derived class object as arguments

  13. 13

    Declaring pure virtual function in base class with derived class object as arguments

  14. 14

    accessing non-template base class virtual function from template derived class

  15. 15

    Deriving from pure virtual template class

  16. 16

    C++ class template or pure virtual

  17. 17

    Derived classes not using all pure virtual methods from the base class

  18. 18

    Delete virtual function from a derived class

  19. 19

    Calling virtual method of base template from derived variadic template class

  20. 20

    Is there a tricky way to avoid overriding all pure virtual functions of template base class, used in multiple inheritance

  21. 21

    Is it valid to "hide" a base class virtual function by making it pure virtual in derived classes?

  22. 22

    C++: call pure virtual function from member function of same class

  23. 23

    Accessing virtual base class function from a derived class

  24. 24

    C++ templates: Calling member function of derived template class from base class

  25. 25

    Class with implementation of pure virtual function

  26. 26

    Calling a pure virtual function from base class that doesn't define it?

  27. 27

    How to return a generic derived class from a virtual function?

  28. 28

    C++ Abstract Base Class with pure virtual operator+ function

  29. 29

    use of pure virtual function defined outside the class in C++?

HotTag

Archive