class Base { public: Base(int val, int pval): val{val}, pval{pval} {} virtual ~Base() = default; virtual void fun() const { } void foo() const { do_foo(); } void bar() const {} protected: int val; private: virtual void do_foo() const = 0; int pval; }; class Derived1: public Base { public: void fun() const override {} Derived1(int val, int pval, double d) : Base{val, pval}, d{d} {} private: double d; }; class Derived11 final: public Derived1 { using Derived1::Derived1; void do_foo() const override {} }; class Derived2: public Base { using Base::Base; void do_foo() const final {} public: void bar() const {} }; struct Derived21: Derived2 { using Derived2::Derived2; void fun() const override {} };