#include #include class Job { public: virtual int cost() const = 0; virtual ~Job() = 0; }; int Job::cost() const { return 5; } Job::~Job() = default; class ConcreteJob final : public Job { public: int cost() const override { return Job::cost() + 3; } }; int main() { static_assert(std::is_abstract::value, "abstract interface"); static_assert(!std::is_abstract::value, "complete implementation"); ConcreteJob job; const Job& interface = job; assert(interface.cost() == 8); assert(job.Job::cost() == 5); }