Have example C++ programs use override specifier
diff --git a/example/cbor-to-json/cbor-to-json.cc b/example/cbor-to-json/cbor-to-json.cc
index 0cfb1ac..c4734d5 100644
--- a/example/cbor-to-json/cbor-to-json.cc
+++ b/example/cbor-to-json/cbor-to-json.cc
@@ -326,7 +326,7 @@
     return "";
   }
 
-  virtual std::string AppendNull() {
+  std::string AppendNull() override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       return "main: invalid JSON map key";
@@ -334,7 +334,7 @@
     return write_dst("null", 4);
   }
 
-  virtual std::string AppendUndefined() {
+  std::string AppendUndefined() override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       return "main: invalid JSON map key";
@@ -346,7 +346,7 @@
     return write_dst("null", 4);
   }
 
-  virtual std::string AppendBool(bool val) {
+  std::string AppendBool(bool val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       return "main: invalid JSON map key";
@@ -357,7 +357,7 @@
     return write_dst("false", 5);
   }
 
-  virtual std::string AppendF64(double val) {
+  std::string AppendF64(double val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       return "main: invalid JSON map key";
@@ -385,7 +385,7 @@
     return write_dst(&buf[0], n);
   }
 
-  virtual std::string AppendI64(int64_t val) {
+  std::string AppendI64(int64_t val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       TRY(write_dst("\"", 1));
@@ -403,7 +403,7 @@
     return "";
   }
 
-  virtual std::string AppendU64(uint64_t val) {
+  std::string AppendU64(uint64_t val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       TRY(write_dst("\"", 1));
@@ -421,7 +421,7 @@
     return "";
   }
 
-  virtual std::string AppendByteString(std::string&& val) {
+  std::string AppendByteString(std::string&& val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_flags.output_cbor_metadata_as_comments) {
       TRY(write_dst("/*cbor:base64url*/\"", 19));
@@ -455,7 +455,7 @@
     return write_dst("\"", 1);
   }
 
-  virtual std::string AppendTextString(std::string&& val) {
+  std::string AppendTextString(std::string&& val) override {
     TRY(WritePreambleAndUpdateContext());
     TRY(write_dst("\"", 1));
     const uint8_t* ptr =
@@ -506,7 +506,7 @@
     return write_dst(&esc6[0], 6);
   }
 
-  virtual std::string AppendMinus1MinusX(uint64_t val) {
+  std::string AppendMinus1MinusX(uint64_t val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       TRY(write_dst("\"", 1));
@@ -532,7 +532,7 @@
     return "";
   }
 
-  virtual std::string AppendCborSimpleValue(uint8_t val) {
+  std::string AppendCborSimpleValue(uint8_t val) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       return "main: invalid JSON map key";
@@ -551,7 +551,7 @@
     return write_dst("*/null", 6);
   }
 
-  virtual std::string AppendCborTag(uint64_t val) {
+  std::string AppendCborTag(uint64_t val) override {
     // No call to WritePreambleAndUpdateContext. A CBOR tag isn't a value. It
     // decorates the upcoming value.
     if (g_flags.output_cbor_metadata_as_comments) {
@@ -560,7 +560,7 @@
     return "";
   }
 
-  virtual std::string Push(uint32_t flags) {
+  std::string Push(uint32_t flags) override {
     TRY(WritePreambleAndUpdateContext());
     if (g_ctx == context::in_dict_after_key) {
       return "main: invalid JSON map key";
@@ -574,7 +574,7 @@
         (flags & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) ? "[" : "{", 1);
   }
 
-  virtual std::string Pop(uint32_t flags) {
+  std::string Pop(uint32_t flags) override {
     // No call to WritePreambleAndUpdateContext. We write the extra comma,
     // outdent, etc. ourselves.
     g_depth--;
diff --git a/example/json-to-cbor/json-to-cbor.cc b/example/json-to-cbor/json-to-cbor.cc
index 7d2bdfe..16994e5 100644
--- a/example/json-to-cbor/json-to-cbor.cc
+++ b/example/json-to-cbor/json-to-cbor.cc
@@ -242,13 +242,13 @@
     return write_dst(&c[0], 9);
   }
 
-  virtual std::string AppendNull() { return write_dst("\xF6", 1); }
+  std::string AppendNull() override { return write_dst("\xF6", 1); }
 
-  virtual std::string AppendBool(bool val) {
+  std::string AppendBool(bool val) override {
     return write_dst(val ? "\xF5" : "\xF4", 1);
   }
 
-  virtual std::string AppendF64(double val) {
+  std::string AppendF64(double val) override {
     uint8_t c[9];
     wuffs_base__lossy_value_u16 lv16 =
         wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(val);
@@ -270,32 +270,28 @@
     return write_dst(&c[0], 9);
   }
 
-  virtual std::string AppendI64(int64_t val) {
+  std::string AppendI64(int64_t val) override {
     return (val >= 0) ? Append(static_cast<uint64_t>(val), 0x00)
                       : Append(static_cast<uint64_t>(-(val + 1)), 0x20);
   }
 
-  virtual std::string AppendByteString(std::string&& val) {
+  std::string AppendByteString(std::string&& val) override {
     TRY(Append(val.size(), 0x40));
     return write_dst(val.data(), val.size());
   }
 
-  virtual std::string AppendTextString(std::string&& val) {
+  std::string AppendTextString(std::string&& val) override {
     TRY(Append(val.size(), 0x60));
     return write_dst(val.data(), val.size());
   }
 
-  virtual std::string Push(uint32_t flags) {
+  std::string Push(uint32_t flags) override {
     return write_dst(
         (flags & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) ? "\x9F" : "\xBF",
         1);
   }
 
-  virtual std::string Pop(uint32_t flags) { return write_dst("\xFF", 1); }
-
-  virtual void Done(wuffs_aux::DecodeJsonResult& result,
-                    wuffs_aux::sync_io::Input& input,
-                    wuffs_aux::IOBuffer& buffer) {}
+  std::string Pop(uint32_t flags) override { return write_dst("\xFF", 1); }
 };
 
 // ----
diff --git a/example/jsonfindptrs/jsonfindptrs.cc b/example/jsonfindptrs/jsonfindptrs.cc
index b5dcef1..c26ff4e 100644
--- a/example/jsonfindptrs/jsonfindptrs.cc
+++ b/example/jsonfindptrs/jsonfindptrs.cc
@@ -414,41 +414,41 @@
     return "main: internal error: non-container stack entry";
   }
 
-  virtual std::string AppendNull() {
+  std::string AppendNull() override {
     JsonThing jt;
     jt.kind = JsonThing::Kind::Null;
     return Append(std::move(jt));
   }
 
-  virtual std::string AppendBool(bool val) {
+  std::string AppendBool(bool val) override {
     JsonThing jt;
     jt.kind = JsonThing::Kind::Bool;
     jt.value.b = val;
     return Append(std::move(jt));
   }
 
-  virtual std::string AppendI64(int64_t val) {
+  std::string AppendI64(int64_t val) override {
     JsonThing jt;
     jt.kind = JsonThing::Kind::Int64;
     jt.value.i = val;
     return Append(std::move(jt));
   }
 
-  virtual std::string AppendF64(double val) {
+  std::string AppendF64(double val) override {
     JsonThing jt;
     jt.kind = JsonThing::Kind::Float64;
     jt.value.f = val;
     return Append(std::move(jt));
   }
 
-  virtual std::string AppendTextString(std::string&& val) {
+  std::string AppendTextString(std::string&& val) override {
     JsonThing jt;
     jt.kind = JsonThing::Kind::String;
     jt.value.s = std::move(val);
     return Append(std::move(jt));
   }
 
-  virtual std::string Push(uint32_t flags) {
+  std::string Push(uint32_t flags) override {
     if (flags & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) {
       JsonThing jt;
       jt.kind = JsonThing::Kind::Array;
@@ -463,7 +463,7 @@
     return "main: internal error: bad push";
   }
 
-  virtual std::string Pop(uint32_t flags) {
+  std::string Pop(uint32_t flags) override {
     if (m_stack.empty()) {
       return "main: internal error: bad pop";
     }
@@ -472,9 +472,9 @@
     return Append(std::move(jt));
   }
 
-  virtual void Done(wuffs_aux::DecodeJsonResult& result,
-                    wuffs_aux::sync_io::Input& input,
-                    wuffs_aux::IOBuffer& buffer) {
+  void Done(wuffs_aux::DecodeJsonResult& result,
+            wuffs_aux::sync_io::Input& input,
+            wuffs_aux::IOBuffer& buffer) override {
     if (!result.error_message.empty()) {
       return;
     } else if (m_stack.size() != 1) {