diff --git a/bench/AAClipBench.cpp b/bench/AAClipBench.cpp
index 57af3be..d0e224f 100644
--- a/bench/AAClipBench.cpp
+++ b/bench/AAClipBench.cpp
@@ -41,8 +41,8 @@
     }
 
 protected:
-    virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    const char* onGetName() override { return fName.c_str(); }
+    void onDraw(int loops, SkCanvas* canvas) override {
 
         SkPaint paint;
         this->setupPaint(&paint);
@@ -111,7 +111,7 @@
     }
 
 protected:
-    virtual const char* onGetName() { return fName.c_str(); }
+    const char* onGetName() override { return fName.c_str(); }
 
 
     void recurse(SkCanvas* canvas,
@@ -156,7 +156,7 @@
             canvas->restore();
     }
 
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    void onDraw(int loops, SkCanvas* canvas) override {
 
         for (int i = 0; i < loops; ++i) {
             SkPoint offset = SkPoint::Make(0, 0);
@@ -192,8 +192,8 @@
     }
 
 protected:
-    virtual const char* onGetName() { return fName.c_str(); }
-    virtual void onDraw(int loops, SkCanvas*) {
+    const char* onGetName() override { return fName.c_str(); }
+    void onDraw(int loops, SkCanvas*) override {
         SkPaint paint;
         this->setupPaint(&paint);
 
@@ -227,8 +227,8 @@
     }
 
 protected:
-    virtual const char* onGetName() { return "aaclip_setregion"; }
-    virtual void onDraw(int loops, SkCanvas*) {
+    const char* onGetName() override { return "aaclip_setregion"; }
+    void onDraw(int loops, SkCanvas*) override {
         for (int i = 0; i < loops; ++i) {
             SkAAClip clip;
             clip.setRegion(fRegion);
diff --git a/bench/BezierBench.cpp b/bench/BezierBench.cpp
index 395cdde..64cc1fe 100644
--- a/bench/BezierBench.cpp
+++ b/bench/BezierBench.cpp
@@ -75,11 +75,11 @@
     }
 
 protected:
-    virtual const char* onGetName() {
+    const char* onGetName() override {
         return fName.c_str();
     }
 
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    void onDraw(int loops, SkCanvas* canvas) override {
         fRec.fCanvas = canvas;
         this->setupPaint(&fRec.fPaint);
         fRec.fPaint.setStyle(SkPaint::kStroke_Style);
diff --git a/bench/BlurRectBench.cpp b/bench/BlurRectBench.cpp
index 2fe92bd..807e426 100644
--- a/bench/BlurRectBench.cpp
+++ b/bench/BlurRectBench.cpp
@@ -39,7 +39,7 @@
     }
 
 protected:
-    virtual const char* onGetName() {
+    const char* onGetName() override {
         return fName.c_str();
     }
 
@@ -51,7 +51,7 @@
         fName = name;
     }
 
-    virtual void onDraw(int loops, SkCanvas*) {
+    void onDraw(int loops, SkCanvas*) override {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/ChromeBench.cpp b/bench/ChromeBench.cpp
index a4f56e9..56ba15f 100644
--- a/bench/ChromeBench.cpp
+++ b/bench/ChromeBench.cpp
@@ -460,8 +460,8 @@
 
 protected:
 
-    virtual const char* onGetName() { return "chrome_scrollGmail"; }
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    const char* onGetName() override { return "chrome_scrollGmail"; }
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkDEBUGCODE(this->validateBounds(canvas));
         SkPaint paint;
         this->setupPaint(&paint);
@@ -473,7 +473,7 @@
             }
         }
     }
-    virtual SkIPoint onGetSize() { return SkIPoint::Make(W, H); }
+    SkIPoint onGetSize() override { return SkIPoint::Make(W, H); }
 
     void setRectangle(SkRect& current, int i) {
         current.setWH(SkIntToScalar(gmailScrollingRectSpec[i*3+1]),
diff --git a/bench/GeometryBench.cpp b/bench/GeometryBench.cpp
index abaf678..7de4717 100644
--- a/bench/GeometryBench.cpp
+++ b/bench/GeometryBench.cpp
@@ -46,7 +46,7 @@
 protected:
     SkRect fRects[2048];
 
-    virtual void onDelayedSetup() {
+    void onDelayedSetup() override {
         const SkScalar min = -100;
         const SkScalar max = 100;
         SkRandom rand;
diff --git a/bench/GradientBench.cpp b/bench/GradientBench.cpp
index e202350..eebd55c 100644
--- a/bench/GradientBench.cpp
+++ b/bench/GradientBench.cpp
@@ -319,11 +319,11 @@
     }
 
 protected:
-    virtual const char* onGetName() {
+    const char* onGetName() override {
         return fName.c_str();
     }
 
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
 
diff --git a/bench/SKPAnimationBench.cpp b/bench/SKPAnimationBench.cpp
index 2bd3efb..72cdef3 100644
--- a/bench/SKPAnimationBench.cpp
+++ b/bench/SKPAnimationBench.cpp
@@ -46,10 +46,10 @@
         , fZoomPeriodMs(zoomPeriodMs) {
     }
 
-    virtual const char* getTag() { return "zoom"; }
+    const char* getTag() override { return "zoom"; }
 
-    virtual void preConcatFrameMatrix(double animationTimeMs, const SkIRect& devBounds,
-                                      SkMatrix* drawMatrix) {
+    void preConcatFrameMatrix(double animationTimeMs, const SkIRect& devBounds,
+                              SkMatrix* drawMatrix) override {
         double t = fmod(animationTimeMs / fZoomPeriodMs, 1.0); // t is in [0, 1).
         t = fabs(2 * t - 1); // Make t ping-pong between 0 and 1
         SkScalar zoom = static_cast<SkScalar>(pow(fZoomMax, t));
diff --git a/bench/SKPAnimationBench.h b/bench/SKPAnimationBench.h
index 153f1fd..573af1d 100644
--- a/bench/SKPAnimationBench.h
+++ b/bench/SKPAnimationBench.h
@@ -23,7 +23,6 @@
         virtual const char* getTag() = 0;
         virtual void preConcatFrameMatrix(double animationTimeMs, const SkIRect& devBounds,
                                           SkMatrix* drawMatrix) = 0;
-        virtual ~Animation() {}
     };
 
     SKPAnimationBench(const char* name, const SkPicture*, const SkIRect& devClip, sk_sp<Animation>,
diff --git a/bench/ScalarBench.cpp b/bench/ScalarBench.cpp
index 714eecc..f22b344 100644
--- a/bench/ScalarBench.cpp
+++ b/bench/ScalarBench.cpp
@@ -56,8 +56,8 @@
         init9(fArray);
     }
 protected:
-    virtual int mulLoopCount() const { return 4; }
-    virtual void performTest() {
+    int mulLoopCount() const override { return 4; }
+    void performTest() override {
         // xoring into a volatile prevents the compiler from optimizing these checks away.
         volatile bool junk = false;
         junk ^= (fArray[6] != 0.0f || fArray[7] != 0.0f || fArray[8] != 1.0f);
@@ -75,8 +75,8 @@
         init9(fArray);
     }
 protected:
-    virtual int mulLoopCount() const { return 4; }
-    virtual void performTest() {
+    int mulLoopCount() const override { return 4; }
+    void performTest() override {
         // xoring into a volatile prevents the compiler from optimizing these checks away.
         volatile int32_t junk = 0;
         junk ^= (SkScalarAs2sCompliment(fArray[6]) |
diff --git a/bench/TableBench.cpp b/bench/TableBench.cpp
index 33654c0..c1e1b95 100644
--- a/bench/TableBench.cpp
+++ b/bench/TableBench.cpp
@@ -29,11 +29,11 @@
     static const int kNumCols = 32;
 
 protected:
-    virtual const char* onGetName() {
+    const char* onGetName() override {
         return "tablebench";
     }
 
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint cellPaint;
         cellPaint.setColor(0xFFFFFFF);
 
diff --git a/bench/TileBench.cpp b/bench/TileBench.cpp
index 0a944dd..9a53773 100644
--- a/bench/TileBench.cpp
+++ b/bench/TileBench.cpp
@@ -73,11 +73,11 @@
     }
 
 protected:
-    virtual const char* onGetName() {
+    const char* onGetName() override {
         return fName.c_str();
     }
 
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint(fPaint);
         this->setupPaint(&paint);
         paint.setFilterQuality(fDoFilter ? kLow_SkFilterQuality
diff --git a/experimental/svg/model/SkSVGClipPath.h b/experimental/svg/model/SkSVGClipPath.h
index 269d1d0..303b47e 100644
--- a/experimental/svg/model/SkSVGClipPath.h
+++ b/experimental/svg/model/SkSVGClipPath.h
@@ -13,13 +13,10 @@
 
 class SkSVGClipPath final : public SkSVGHiddenContainer {
 public:
-    virtual ~SkSVGClipPath() = default;
     static sk_sp<SkSVGClipPath> Make() {
         return sk_sp<SkSVGClipPath>(new SkSVGClipPath());
     }
 
-protected:
-
 private:
     SkSVGClipPath();
 
diff --git a/experimental/svg/model/SkSVGDOM.h b/experimental/svg/model/SkSVGDOM.h
index c565913..96e9956 100644
--- a/experimental/svg/model/SkSVGDOM.h
+++ b/experimental/svg/model/SkSVGDOM.h
@@ -21,7 +21,6 @@
 class SkSVGDOM : public SkRefCnt {
 public:
     SkSVGDOM();
-    ~SkSVGDOM() = default;
 
     static sk_sp<SkSVGDOM> MakeFromDOM(const SkDOM&);
     static sk_sp<SkSVGDOM> MakeFromStream(SkStream&);
diff --git a/experimental/svg/model/SkSVGDefs.h b/experimental/svg/model/SkSVGDefs.h
index 1f4fa07..17ce30e 100644
--- a/experimental/svg/model/SkSVGDefs.h
+++ b/experimental/svg/model/SkSVGDefs.h
@@ -12,7 +12,6 @@
 
 class SkSVGDefs : public SkSVGHiddenContainer {
 public:
-    virtual ~SkSVGDefs() = default;
     static sk_sp<SkSVGDefs> Make() { return sk_sp<SkSVGDefs>(new SkSVGDefs()); }
 
 private:
diff --git a/experimental/svg/model/SkSVGG.h b/experimental/svg/model/SkSVGG.h
index ca1c71c..9229269 100644
--- a/experimental/svg/model/SkSVGG.h
+++ b/experimental/svg/model/SkSVGG.h
@@ -12,8 +12,6 @@
 
 class SkSVGG : public SkSVGContainer {
 public:
-    virtual ~SkSVGG() = default;
-
     static sk_sp<SkSVGG> Make() { return sk_sp<SkSVGG>(new SkSVGG()); }
 
 private:
diff --git a/experimental/svg/model/SkSVGHiddenContainer.h b/experimental/svg/model/SkSVGHiddenContainer.h
index b28cd00..14d82c3 100644
--- a/experimental/svg/model/SkSVGHiddenContainer.h
+++ b/experimental/svg/model/SkSVGHiddenContainer.h
@@ -11,9 +11,6 @@
 #include "experimental/svg/model/SkSVGContainer.h"
 
 class SkSVGHiddenContainer : public SkSVGContainer {
-public:
-    virtual ~SkSVGHiddenContainer() = default;
-
 protected:
     explicit SkSVGHiddenContainer(SkSVGTag t) : INHERITED(t) {}
 
diff --git a/experimental/svg/model/SkSVGNode.h b/experimental/svg/model/SkSVGNode.h
index aa37e02..5c97949 100644
--- a/experimental/svg/model/SkSVGNode.h
+++ b/experimental/svg/model/SkSVGNode.h
@@ -40,7 +40,7 @@
 
 class SkSVGNode : public SkRefCnt {
 public:
-    virtual ~SkSVGNode();
+    ~SkSVGNode() override;
 
     SkSVGTag tag() const { return fTag; }
 
diff --git a/gm/complexclip3.cpp b/gm/complexclip3.cpp
index f95fa2e..b6fea1f 100644
--- a/gm/complexclip3.cpp
+++ b/gm/complexclip3.cpp
@@ -36,15 +36,15 @@
 
 protected:
 
-    SkString onShortName() {
+    SkString onShortName() override {
         SkString str;
         str.printf("complexclip3_%s", fDoSimpleClipFirst ? "simple" : "complex");
         return str;
     }
 
-    SkISize onISize() { return SkISize::Make(400, 950); }
+    SkISize onISize() override { return SkISize::Make(400, 950); }
 
-    virtual void onDraw(SkCanvas* canvas) {
+    void onDraw(SkCanvas* canvas) override {
         SkPath clipSimple;
         clipSimple.addCircle(SkIntToScalar(70), SkIntToScalar(50), SkIntToScalar(20));
 
diff --git a/gm/complexclip4.cpp b/gm/complexclip4.cpp
index ce34bfa..2709e2e 100644
--- a/gm/complexclip4.cpp
+++ b/gm/complexclip4.cpp
@@ -29,16 +29,14 @@
     }
 
 protected:
-
-
-    SkString onShortName() {
+    SkString onShortName() override {
         SkString str;
         str.printf("complexclip4_%s",
                    fDoAAClip ? "aa" : "bw");
         return str;
     }
 
-    SkISize onISize() { return SkISize::Make(970, 780); }
+    SkISize onISize() override { return SkISize::Make(970, 780); }
 
     // Android Framework will still support the legacy kReplace SkClipOp on older devices, so
     // this represents how to do so while also respecting the device restriction using the newer
@@ -71,7 +69,7 @@
         canvas->clipPath(path, SkClipOp::kIntersect, aa);
     }
 
-    virtual void onDraw(SkCanvas* canvas) {
+    void onDraw(SkCanvas* canvas) override {
         SkPaint p;
         p.setAntiAlias(fDoAAClip);
         p.setColor(SK_ColorYELLOW);
diff --git a/gm/compositor_quads.cpp b/gm/compositor_quads.cpp
index 8a12132..b4ef7f8 100644
--- a/gm/compositor_quads.cpp
+++ b/gm/compositor_quads.cpp
@@ -199,8 +199,6 @@
 
 class ClipTileRenderer : public SkRefCntBase {
 public:
-    virtual ~ClipTileRenderer() {}
-
     // Draw the base rect, possibly clipped by 'clip' if that is not null. The edges to antialias
     // are specified in 'edgeAA' (to make manipulation easier than an unsigned bitfield). 'tileID'
     // represents the location of rect within the tile grid, 'quadID' is the unique ID of the clip
diff --git a/include/core/SkBBHFactory.h b/include/core/SkBBHFactory.h
index a41c73d..5a7b06e 100644
--- a/include/core/SkBBHFactory.h
+++ b/include/core/SkBBHFactory.h
@@ -16,7 +16,6 @@
 class SkBBoxHierarchy : public SkRefCnt {
 public:
     SkBBoxHierarchy() {}
-    virtual ~SkBBoxHierarchy() {}
 
     struct Metadata {
         bool isDraw;  // The corresponding SkRect bounds a draw command, not a pure state change.
diff --git a/include/core/SkDataTable.h b/include/core/SkDataTable.h
index 8a4834f..aa4bcb1 100644
--- a/include/core/SkDataTable.h
+++ b/include/core/SkDataTable.h
@@ -108,7 +108,7 @@
     SkDataTable(const void* array, size_t elemSize, int count,
                 FreeProc, void* context);
     SkDataTable(const Dir*, int count, FreeProc, void* context);
-    virtual ~SkDataTable();
+    ~SkDataTable() override;
 
     friend class SkDataTableBuilder;    // access to Dir
 
diff --git a/include/core/SkDocument.h b/include/core/SkDocument.h
index 0548711..375f6db 100644
--- a/include/core/SkDocument.h
+++ b/include/core/SkDocument.h
@@ -64,7 +64,7 @@
 
     // note: subclasses must call close() in their destructor, as the base class
     // cannot do this for them.
-    virtual ~SkDocument();
+    ~SkDocument() override;
 
     virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height) = 0;
     virtual void onEndPage() = 0;
diff --git a/include/core/SkRWBuffer.h b/include/core/SkRWBuffer.h
index c0d24f6..9daf3f5 100644
--- a/include/core/SkRWBuffer.h
+++ b/include/core/SkRWBuffer.h
@@ -59,7 +59,7 @@
 
 private:
     SkROBuffer(const SkBufferHead* head, size_t available, const SkBufferBlock* fTail);
-    virtual ~SkROBuffer();
+    ~SkROBuffer() override;
 
     const SkBufferHead*     fHead;
     const size_t            fAvailable;
diff --git a/include/core/SkTypeface.h b/include/core/SkTypeface.h
index 778588e..032fd71 100644
--- a/include/core/SkTypeface.h
+++ b/include/core/SkTypeface.h
@@ -345,7 +345,7 @@
     /** uniqueID must be unique and non-zero
     */
     SkTypeface(const SkFontStyle& style, bool isFixedPitch = false);
-    virtual ~SkTypeface();
+    ~SkTypeface() override;
 
     virtual sk_sp<SkTypeface> onMakeClone(const SkFontArguments&) const = 0;
 
diff --git a/include/effects/SkRuntimeEffect.h b/include/effects/SkRuntimeEffect.h
index 72d03b3..84be79f 100644
--- a/include/effects/SkRuntimeEffect.h
+++ b/include/effects/SkRuntimeEffect.h
@@ -131,7 +131,7 @@
     bool usesSampleCoords() const { return fMainFunctionHasSampleCoords; }
 
     static void RegisterFlattenables();
-    ~SkRuntimeEffect();
+    ~SkRuntimeEffect() override;
 
 private:
     SkRuntimeEffect(SkString sksl,
diff --git a/include/private/GrContext_Base.h b/include/private/GrContext_Base.h
index b347f17..f84d0b5 100644
--- a/include/private/GrContext_Base.h
+++ b/include/private/GrContext_Base.h
@@ -22,7 +22,7 @@
 
 class GrContext_Base : public SkRefCnt {
 public:
-    virtual ~GrContext_Base();
+    ~GrContext_Base() override;
 
     /*
      * Safely downcast to a GrDirectContext.
diff --git a/modules/skottie/src/SkottieTest.cpp b/modules/skottie/src/SkottieTest.cpp
index c68fc7c9e..cb217c0 100644
--- a/modules/skottie/src/SkottieTest.cpp
+++ b/modules/skottie/src/SkottieTest.cpp
@@ -706,7 +706,7 @@
     private:
         sk_sp<ImageAsset> loadImageAsset(const char path[],
                                          const char name[],
-                                         const char id[]) const {
+                                         const char id[]) const override {
             return strcmp(id, "single_frame")
                     ? fMultiFrameAsset
                     : fSingleFrameAsset;
diff --git a/modules/skottie/src/animator/Animator.h b/modules/skottie/src/animator/Animator.h
index 399d98c..0ad4d2a 100644
--- a/modules/skottie/src/animator/Animator.h
+++ b/modules/skottie/src/animator/Animator.h
@@ -28,8 +28,6 @@
 
 class Animator : public SkRefCnt {
 public:
-    virtual ~Animator() = default;
-
     using StateChanged = bool;
     StateChanged seek(float t) { return this->onSeek(t); }
 
diff --git a/modules/skottie/src/layers/PrecompLayer.cpp b/modules/skottie/src/layers/PrecompLayer.cpp
index 40de742..3ba7d80 100644
--- a/modules/skottie/src/layers/PrecompLayer.cpp
+++ b/modules/skottie/src/layers/PrecompLayer.cpp
@@ -144,7 +144,7 @@
             , fFps(fps) {}
 
     private:
-        StateChanged onSeek(float t) {
+        StateChanged onSeek(float t) override {
             fSGAdapter->setT(t / fFps);
 
             return true;
diff --git a/modules/skparagraph/include/FontCollection.h b/modules/skparagraph/include/FontCollection.h
index f733628..ded17bf 100644
--- a/modules/skparagraph/include/FontCollection.h
+++ b/modules/skparagraph/include/FontCollection.h
@@ -19,8 +19,6 @@
 public:
     FontCollection();
 
-    ~FontCollection() = default;
-
     size_t getFontManagersCount() const;
 
     void setAssetFontManager(sk_sp<SkFontMgr> fontManager);
diff --git a/modules/skparagraph/tests/SkParagraphTest.cpp b/modules/skparagraph/tests/SkParagraphTest.cpp
index e4f821d..8a3a9ac 100644
--- a/modules/skparagraph/tests/SkParagraphTest.cpp
+++ b/modules/skparagraph/tests/SkParagraphTest.cpp
@@ -107,8 +107,6 @@
         this->disableFontFallback();
     }
 
-    ~ResourceFontCollection() = default;
-
     size_t resolvedFonts() const { return fResolvedFonts; }
 
     // TODO: temp solution until we check in fonts
diff --git a/modules/skparagraph/utils/TestFontCollection.h b/modules/skparagraph/utils/TestFontCollection.h
index 9d92ed8..f1c6175 100644
--- a/modules/skparagraph/utils/TestFontCollection.h
+++ b/modules/skparagraph/utils/TestFontCollection.h
@@ -8,7 +8,6 @@
 class TestFontCollection : public FontCollection {
 public:
     TestFontCollection(const std::string& resourceDir, bool testOnly = false, bool loadFonts = true);
-    ~TestFontCollection() = default;
 
     size_t fontsFound() const { return fFontsFound; }
     bool addFontFromFile(const std::string& path, const std::string& familyName = "");
diff --git a/samplecode/Sample2PtRadial.cpp b/samplecode/Sample2PtRadial.cpp
index 64f9e66..4aadacb 100644
--- a/samplecode/Sample2PtRadial.cpp
+++ b/samplecode/Sample2PtRadial.cpp
@@ -14,9 +14,9 @@
     TwoPtConicalView() {}
 
 protected:
-    virtual SkString name() { return SkString("2PtConical"); }
+    SkString name() override { return SkString("2PtConical"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
 
         SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index 8eb82b9..b500785 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -541,9 +541,7 @@
         ,  fValHi(fMax) {
     }
 
-    virtual ~BiControl() {}
-
-    virtual void draw(SkCanvas* canvas, const ControlPaints& paints) {
+    void draw(SkCanvas* canvas, const ControlPaints& paints) override {
         UniControl::draw(canvas, paints);
         if (!fVisible || fValHi == fValLo) {
             return;
diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp
index f22aea1..91bb523 100644
--- a/samplecode/SampleEffects.cpp
+++ b/samplecode/SampleEffects.cpp
@@ -86,9 +86,9 @@
     }
 
 protected:
-    virtual SkString name() { return SkString("Effects"); }
+    SkString name() override { return SkString("Effects"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         canvas->scale(3, 3);
         canvas->translate(10, 30);
         for (size_t i = 0; i < SK_ARRAY_COUNT(fPaint); i++) {
diff --git a/samplecode/SampleEmboss.cpp b/samplecode/SampleEmboss.cpp
index beacecb..d36dc29 100644
--- a/samplecode/SampleEmboss.cpp
+++ b/samplecode/SampleEmboss.cpp
@@ -33,9 +33,9 @@
     }
 
 protected:
-    virtual SkString name() { return SkString("Emboss"); }
+    SkString name() override { return SkString("Emboss"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
 
         paint.setAntiAlias(true);
diff --git a/samplecode/SampleFillType.cpp b/samplecode/SampleFillType.cpp
index 230f41b..3aa4cb2 100644
--- a/samplecode/SampleFillType.cpp
+++ b/samplecode/SampleFillType.cpp
@@ -25,7 +25,7 @@
     }
 
 protected:
-    virtual SkString name() { return SkString("FillType"); }
+    SkString name() override{ return SkString("FillType"); }
 
     void showPath(SkCanvas* canvas, int x, int y, SkPathFillType ft,
                   SkScalar scale, const SkPaint& paint) {
@@ -55,7 +55,7 @@
                  scale, paint);
     }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
 
         SkPaint paint;
diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp
index 546c6c4..7e00267 100644
--- a/samplecode/SampleLayerMask.cpp
+++ b/samplecode/SampleLayerMask.cpp
@@ -20,7 +20,7 @@
     }
 
 protected:
-    virtual SkString name() { return SkString("LayerMask"); }
+    SkString name() override { return SkString("LayerMask"); }
 
     void drawMask(SkCanvas* canvas, const SkRect& r) {
         SkPaint paint;
@@ -48,7 +48,7 @@
         }
     }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         SkRect  r;
         r.setLTRB(20, 20, 120, 120);
         canvas->saveLayer(&r, nullptr);
diff --git a/samplecode/SamplePolyToPoly.cpp b/samplecode/SamplePolyToPoly.cpp
index f8caf38..942a722 100644
--- a/samplecode/SamplePolyToPoly.cpp
+++ b/samplecode/SamplePolyToPoly.cpp
@@ -69,7 +69,7 @@
     }
 
 protected:
-    virtual SkString name() { return SkString("PolyToPolyView"); }
+    SkString name() override { return SkString("PolyToPolyView"); }
 
     static void doDraw(SkCanvas* canvas, SkPaint* paint, const SkFont& font, const int isrc[],
                        const int idst[], int count) {
@@ -105,7 +105,7 @@
         canvas->restore();
     }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStrokeWidth(SkIntToScalar(4));
diff --git a/samplecode/SampleStrokeRect.cpp b/samplecode/SampleStrokeRect.cpp
index 669a357..f172c47 100644
--- a/samplecode/SampleStrokeRect.cpp
+++ b/samplecode/SampleStrokeRect.cpp
@@ -13,9 +13,9 @@
     StrokeRectSample() {}
 
 protected:
-    virtual SkString name() { return SkString("Stroke Rects"); }
+    SkString name() override { return SkString("Stroke Rects"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
diff --git a/samplecode/SampleThinAA.cpp b/samplecode/SampleThinAA.cpp
index 8b22aea..d7499ba 100644
--- a/samplecode/SampleThinAA.cpp
+++ b/samplecode/SampleThinAA.cpp
@@ -21,8 +21,6 @@
     static constexpr SkScalar kTileWidth = 20.f;
     static constexpr SkScalar kTileHeight = 20.f;
 
-    virtual ~ShapeRenderer() {}
-
     // Draw the shape, limited to kTileWidth x kTileHeight. It must apply the local subpixel (tx,
     // ty) translation and rotation by angle. Prior to these transform adjustments, the SkCanvas
     // will only have pixel aligned translations (these are separated to make super-sampling
diff --git a/samplecode/SampleWritePixels.cpp b/samplecode/SampleWritePixels.cpp
index f6d31e5..d014e86 100644
--- a/samplecode/SampleWritePixels.cpp
+++ b/samplecode/SampleWritePixels.cpp
@@ -32,9 +32,9 @@
     WritePixelsView() {}
 
 protected:
-    virtual SkString name() { return SkString("WritePixels"); }
+    SkString name() override { return SkString("WritePixels"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         SkBitmap bitmap;
         create_bitmap(&bitmap);
         int x = bitmap.width() / 2;
diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp
index 592cf71..b565b79 100644
--- a/samplecode/SampleXfermodesBlur.cpp
+++ b/samplecode/SampleXfermodesBlur.cpp
@@ -73,9 +73,9 @@
     }
 
 protected:
-    virtual SkString name() { return SkString("XfermodesBlur"); }
+    SkString name() override { return SkString("XfermodesBlur"); }
 
-    virtual void onDrawContent(SkCanvas* canvas) {
+    void onDrawContent(SkCanvas* canvas) override {
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
 
         const SkBlendMode gModes[] = {
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 18d468b..5b3c218 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -35,7 +35,7 @@
       */
     SkShaderBlitter(const SkPixmap& device, const SkPaint& paint,
                     SkShaderBase::Context* shaderContext);
-    virtual ~SkShaderBlitter();
+    ~SkShaderBlitter() override;
 
 protected:
     uint32_t                fShaderFlags;
diff --git a/src/core/SkImageFilterCache.h b/src/core/SkImageFilterCache.h
index b82f4da..24d9449 100644
--- a/src/core/SkImageFilterCache.h
+++ b/src/core/SkImageFilterCache.h
@@ -55,7 +55,7 @@
 
     enum { kDefaultTransientSize = 32 * 1024 * 1024 };
 
-    virtual ~SkImageFilterCache() {}
+    ~SkImageFilterCache() override {}
     static SkImageFilterCache* Create(size_t maxBytes);
     static SkImageFilterCache* Get();
 
diff --git a/src/core/SkPtrRecorder.h b/src/core/SkPtrRecorder.h
index 2ea550f..389751d 100644
--- a/src/core/SkPtrRecorder.h
+++ b/src/core/SkPtrRecorder.h
@@ -127,12 +127,12 @@
  */
 class SkRefCntSet : public SkTPtrSet<SkRefCnt*> {
 public:
-    virtual ~SkRefCntSet();
+    ~SkRefCntSet() override;
 
 protected:
     // overrides
-    virtual void incPtr(void*);
-    virtual void decPtr(void*);
+    virtual void incPtr(void*) override ;
+    virtual void decPtr(void*) override ;
 };
 
 class SkFactorySet : public SkTPtrSet<SkFlattenable::Factory> {};
diff --git a/src/core/SkRecord.h b/src/core/SkRecord.h
index 10a385f..d62cb15 100644
--- a/src/core/SkRecord.h
+++ b/src/core/SkRecord.h
@@ -28,7 +28,7 @@
 class SkRecord : public SkRefCnt {
 public:
     SkRecord() = default;
-    ~SkRecord();
+    ~SkRecord() override;
 
     // Returns the number of canvas commands in this SkRecord.
     int count() const { return fCount; }
diff --git a/src/core/SkSpecialSurface.cpp b/src/core/SkSpecialSurface.cpp
index ee52cd4..90e3e45 100644
--- a/src/core/SkSpecialSurface.cpp
+++ b/src/core/SkSpecialSurface.cpp
@@ -18,8 +18,6 @@
         , fCanvas(nullptr) {
     }
 
-    virtual ~SkSpecialSurface_Base() { }
-
     // reset is called after an SkSpecialImage has been snapped
     void reset() { fCanvas.reset(); }
 
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index ad627b9..05fe10d 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -726,7 +726,7 @@
 public:
     explicit SkBlockMemoryRefCnt(SkDynamicMemoryWStream::Block* head) : fHead(head) { }
 
-    virtual ~SkBlockMemoryRefCnt() {
+    ~SkBlockMemoryRefCnt() override {
         SkDynamicMemoryWStream::Block* block = fHead;
         while (block != nullptr) {
             SkDynamicMemoryWStream::Block* next = block->fNext;
diff --git a/src/gpu/GrRingBuffer.h b/src/gpu/GrRingBuffer.h
index 2498c0d..e46afb7 100644
--- a/src/gpu/GrRingBuffer.h
+++ b/src/gpu/GrRingBuffer.h
@@ -31,7 +31,6 @@
         // Because of this, size needs to be a power of two.
         SkASSERT(SkIsPow2(size));
     }
-    virtual ~GrRingBuffer() = default;
 
     struct Slice {
         sk_sp<GrGpuBuffer> fBuffer;
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index 08da3f3..6f2e4b5 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -63,7 +63,7 @@
                                    int vertexStride,
                                    int instanceStride);
 
-    ~GrGLProgram();
+    ~GrGLProgram() override;
 
     /**
      * Call to abandon GL objects owned by this program.
diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h
index 86161d3..8828d69 100644
--- a/src/image/SkImage_Base.h
+++ b/src/image/SkImage_Base.h
@@ -34,7 +34,7 @@
 
 class SkImage_Base : public SkImage {
 public:
-    virtual ~SkImage_Base();
+    ~SkImage_Base() override;
 
     virtual SkIRect onGetSubset() const {
         return { 0, 0, this->width(), this->height() };
diff --git a/src/image/SkSurface_Base.h b/src/image/SkSurface_Base.h
index 7883cea..ad3c70f 100644
--- a/src/image/SkSurface_Base.h
+++ b/src/image/SkSurface_Base.h
@@ -18,7 +18,7 @@
 public:
     SkSurface_Base(int width, int height, const SkSurfaceProps*);
     SkSurface_Base(const SkImageInfo&, const SkSurfaceProps*);
-    virtual ~SkSurface_Base();
+    ~SkSurface_Base() override;
 
     virtual GrContext* onGetContext_deprecated();
     virtual GrRecordingContext* onGetRecordingContext();
diff --git a/src/lazy/SkDiscardableMemoryPool.h b/src/lazy/SkDiscardableMemoryPool.h
index 46519e3..793e58a 100644
--- a/src/lazy/SkDiscardableMemoryPool.h
+++ b/src/lazy/SkDiscardableMemoryPool.h
@@ -27,8 +27,6 @@
  */
 class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
 public:
-    virtual ~SkDiscardableMemoryPool() { }
-
     virtual size_t getRAMUsed() = 0;
     virtual void setRAMBudget(size_t budget) = 0;
     virtual size_t getRAMBudget() = 0;
diff --git a/tests/ArenaAllocTest.cpp b/tests/ArenaAllocTest.cpp
index 55c3c61..b186d59 100644
--- a/tests/ArenaAllocTest.cpp
+++ b/tests/ArenaAllocTest.cpp
@@ -55,7 +55,7 @@
     struct FooRefCnt : public SkRefCnt {
         FooRefCnt() : x(-2), y(-3.0f) { created++; }
         FooRefCnt(int X, float Y) : x(X), y(Y) { created++; }
-        ~FooRefCnt() { destroyed++; }
+        ~FooRefCnt() override { destroyed++; }
 
         int x;
         float y;
diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp
index 4c228dc..d8e7788 100644
--- a/tests/CanvasTest.cpp
+++ b/tests/CanvasTest.cpp
@@ -482,7 +482,7 @@
     LifeLineCanvas(int w, int h, bool* lifeline) : SkCanvas(w, h), fLifeLine(lifeline) {
         *fLifeLine = true;
     }
-    ~LifeLineCanvas() {
+    ~LifeLineCanvas() override {
         *fLifeLine = false;
     }
 };
diff --git a/tests/GrMemoryPoolTest.cpp b/tests/GrMemoryPoolTest.cpp
index 1220754..aaa8f07 100644
--- a/tests/GrMemoryPoolTest.cpp
+++ b/tests/GrMemoryPoolTest.cpp
@@ -66,15 +66,14 @@
 class B : public A {
 public:
     B() {}
-    virtual void setValues(int v) {
+    void setValues(int v) override {
         fDouble = static_cast<double>(v);
         this->INHERITED::setValues(v);
     }
-    virtual bool checkValues(int v) {
+    bool checkValues(int v) override {
         return fDouble == static_cast<double>(v) &&
                this->INHERITED::checkValues(v);
     }
-    virtual ~B() {}
 
 private:
     double fDouble;
@@ -85,15 +84,14 @@
 class C : public A {
 public:
     C() {}
-    virtual void setValues(int v) {
+    void setValues(int v) override {
         fInt64 = static_cast<int64_t>(v);
         this->INHERITED::setValues(v);
     }
-    virtual bool checkValues(int v) {
+    bool checkValues(int v) override {
         return fInt64 == static_cast<int64_t>(v) &&
                this->INHERITED::checkValues(v);
     }
-    virtual ~C() {}
 
 private:
     int64_t fInt64;
@@ -107,17 +105,17 @@
     D() {
         fB = new B();
     }
-    virtual void setValues(int v) {
+    void setValues(int v) override {
         fVoidStar = reinterpret_cast<void*>(static_cast<intptr_t>(v));
         this->INHERITED::setValues(v);
         fB->setValues(v);
     }
-    virtual bool checkValues(int v) {
+    bool checkValues(int v) override {
         return fVoidStar == reinterpret_cast<void*>(static_cast<intptr_t>(v)) &&
                fB->checkValues(v) &&
                this->INHERITED::checkValues(v);
     }
-    virtual ~D() {
+    ~D() override {
         delete fB;
     }
 private:
@@ -130,13 +128,13 @@
 class E : public A {
 public:
     E() {}
-    virtual void setValues(int v) {
+    void setValues(int v) override {
         for (size_t i = 0; i < SK_ARRAY_COUNT(fIntArray); ++i) {
             fIntArray[i] = v;
         }
         this->INHERITED::setValues(v);
     }
-    virtual bool checkValues(int v) {
+    bool checkValues(int v) override {
         bool ok = true;
         for (size_t i = 0; ok && i < SK_ARRAY_COUNT(fIntArray); ++i) {
             if (fIntArray[i] != v) {
@@ -145,7 +143,6 @@
         }
         return ok && this->INHERITED::checkValues(v);
     }
-    virtual ~E() {}
 private:
     int   fIntArray[20];
 
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index ecf5585..3f32b45 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -728,12 +728,12 @@
         , fCurrIndex(0)
     {}
 
-    ~TestAnnotationCanvas() {
+    ~TestAnnotationCanvas() override {
         REPORTER_ASSERT(fReporter, fCount == fCurrIndex);
     }
 
 protected:
-    void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value) {
+    void onDrawAnnotation(const SkRect& rect, const char key[], SkData* value) override {
         REPORTER_ASSERT(fReporter, fCurrIndex < fCount);
         REPORTER_ASSERT(fReporter, rect == fRec[fCurrIndex].fRect);
         REPORTER_ASSERT(fReporter, !strcmp(key, fRec[fCurrIndex].fKey));
diff --git a/tools/DDLPromiseImageHelper.h b/tools/DDLPromiseImageHelper.h
index 6756fc1..130f1ec 100644
--- a/tools/DDLPromiseImageHelper.h
+++ b/tools/DDLPromiseImageHelper.h
@@ -38,7 +38,7 @@
             : fContext(direct)
             , fBackendFormat(backendFormat) {}
 
-    ~PromiseImageCallbackContext();
+    ~PromiseImageCallbackContext() override;
 
     const GrBackendFormat& backendFormat() const { return fBackendFormat; }
 
diff --git a/tools/fonts/TestTypeface.h b/tools/fonts/TestTypeface.h
index 0d43d09..fc52070 100644
--- a/tools/fonts/TestTypeface.h
+++ b/tools/fonts/TestTypeface.h
@@ -47,7 +47,7 @@
 class SkTestFont : public SkRefCnt {
 public:
     SkTestFont(const SkTestFontData&);
-    virtual ~SkTestFont();
+    ~SkTestFont() override;
     SkGlyphID glyphForUnichar(SkUnichar charCode) const;
     void      init(const SkScalar* pts, const unsigned char* verbs);
 
diff --git a/tools/using_skia_and_harfbuzz.cpp b/tools/using_skia_and_harfbuzz.cpp
index 03fcf30..7f8d593 100644
--- a/tools/using_skia_and_harfbuzz.cpp
+++ b/tools/using_skia_and_harfbuzz.cpp
@@ -77,8 +77,8 @@
 }
 
 struct DoubleOption : Option<double> {
-    virtual void set(std::string _value) { value = atof(_value.c_str()); }
-    virtual std::string valueToString() {
+    void set(std::string _value) override { value = atof(_value.c_str()); }
+    std::string valueToString() override {
         std::ostringstream stm;
         stm << value;
         return stm.str();
@@ -90,8 +90,8 @@
 };
 
 struct StringOption : Option<std::string> {
-    virtual void set(std::string _value) { value = _value; }
-    virtual std::string valueToString() { return value; }
+    void set(std::string _value) override { value = _value; }
+    std::string valueToString() override { return value; }
     StringOption(std::string _selector,
                  std::string _description,
                  std::string defaultValue)
diff --git a/tools/viewer/Slide.h b/tools/viewer/Slide.h
index cc02077..bdd8e5e 100644
--- a/tools/viewer/Slide.h
+++ b/tools/viewer/Slide.h
@@ -18,8 +18,6 @@
 
 class Slide : public SkRefCnt {
 public:
-    virtual ~Slide() {}
-
     virtual SkISize getDimensions() const = 0;
 
     virtual void gpuTeardown() { }
diff --git a/tools/viewer/SlideDir.cpp b/tools/viewer/SlideDir.cpp
index 017febe..5cce6b1 100644
--- a/tools/viewer/SlideDir.cpp
+++ b/tools/viewer/SlideDir.cpp
@@ -26,7 +26,6 @@
 
 class SlideDir::Animator : public SkRefCnt {
 public:
-    virtual ~Animator() = default;
     Animator(const Animator&) = delete;
     Animator& operator=(const Animator&) = delete;
 
@@ -195,7 +194,7 @@
     }
 
 protected:
-    void onTick(float t) {
+    void onTick(float t) override {
         if (!this->isAnimating())
             return;
 
