Mark overridden destructors with 'override' and remove 'virtual'

This silences a new warning in clang 5.0

Change-Id: Ieb5b75a6ffed60107c3fd16075d2ecfd515b55e8
Reviewed-on: https://skia-review.googlesource.com/10006
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h
index 7a2ebae..09231f1 100644
--- a/src/codec/SkPngCodec.h
+++ b/src/codec/SkPngCodec.h
@@ -32,7 +32,7 @@
     // Assume IsPng was called and returned true.
     static SkCodec* NewFromStream(SkStream*, SkPngChunkReader* = NULL);
 
-    virtual ~SkPngCodec();
+    ~SkPngCodec() override;
 
 protected:
     // We hold the png_ptr and info_ptr as voidp to avoid having to include png.h
diff --git a/src/codec/SkRawAdapterCodec.h b/src/codec/SkRawAdapterCodec.h
index 8777180..29e817c 100644
--- a/src/codec/SkRawAdapterCodec.h
+++ b/src/codec/SkRawAdapterCodec.h
@@ -24,7 +24,7 @@
 
     explicit SkRawAdapterCodec(SkRawCodec*);
 
-    virtual ~SkRawAdapterCodec() {}
+    ~SkRawAdapterCodec() override {}
 
 protected:
 
diff --git a/src/codec/SkRawCodec.cpp b/src/codec/SkRawCodec.cpp
index 0a1cea1..97baa9c 100644
--- a/src/codec/SkRawCodec.cpp
+++ b/src/codec/SkRawCodec.cpp
@@ -201,7 +201,7 @@
 
 class SkRawLimitedDynamicMemoryWStream : public SkDynamicMemoryWStream {
 public:
-    virtual ~SkRawLimitedDynamicMemoryWStream() {}
+    ~SkRawLimitedDynamicMemoryWStream() override {}
 
     bool write(const void* buffer, size_t size) override {
         size_t newSize;
diff --git a/src/codec/SkSampledCodec.h b/src/codec/SkSampledCodec.h
index 35e4f57..4bcf5bc 100644
--- a/src/codec/SkSampledCodec.h
+++ b/src/codec/SkSampledCodec.h
@@ -19,7 +19,7 @@
 
     explicit SkSampledCodec(SkCodec*);
 
-    virtual ~SkSampledCodec() {}
+    ~SkSampledCodec() override {}
 
 protected:
 
diff --git a/src/codec/SkWebpAdapterCodec.h b/src/codec/SkWebpAdapterCodec.h
index ece46a6..b2c6c7b 100644
--- a/src/codec/SkWebpAdapterCodec.h
+++ b/src/codec/SkWebpAdapterCodec.h
@@ -19,7 +19,7 @@
 
     explicit SkWebpAdapterCodec(SkWebpCodec*);
 
-    virtual ~SkWebpAdapterCodec() {}
+    ~SkWebpAdapterCodec() override {}
 
 protected:
 
diff --git a/src/core/SkAAClip.h b/src/core/SkAAClip.h
index c94756f..ff7801f 100644
--- a/src/core/SkAAClip.h
+++ b/src/core/SkAAClip.h
@@ -100,7 +100,7 @@
 class SkAAClipBlitter : public SkBlitter {
 public:
     SkAAClipBlitter() : fScanlineScratch(nullptr) {}
-    virtual ~SkAAClipBlitter();
+    ~SkAAClipBlitter() override;
 
     void init(SkBlitter* blitter, const SkAAClip* aaclip) {
         SkASSERT(aaclip && !aaclip->isEmpty());
diff --git a/src/core/SkBitmapCache.cpp b/src/core/SkBitmapCache.cpp
index 0751089..76b4588 100644
--- a/src/core/SkBitmapCache.cpp
+++ b/src/core/SkBitmapCache.cpp
@@ -228,7 +228,7 @@
         fMipMap->attachToCacheAndRef();
     }
 
-    virtual ~MipMapRec() {
+    ~MipMapRec() override {
         fMipMap->detachFromCacheAndUnref();
     }
 
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
index a386904..0e8bd2d 100644
--- a/src/core/SkBlitter.cpp
+++ b/src/core/SkBlitter.cpp
@@ -611,7 +611,7 @@
             }
         }
 
-        virtual ~Sk3DShaderContext() {
+        ~Sk3DShaderContext() override {
             if (fProxyContext) {
                 fProxyContext->~Context();
             }
diff --git a/src/core/SkBlitter_RGB16.cpp b/src/core/SkBlitter_RGB16.cpp
index e91e23f..6330a39 100644
--- a/src/core/SkBlitter_RGB16.cpp
+++ b/src/core/SkBlitter_RGB16.cpp
@@ -111,7 +111,7 @@
 public:
     SkRGB16_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
                            SkShader::Context* shaderContext);
-    virtual ~SkRGB16_Shader_Blitter();
+    ~SkRGB16_Shader_Blitter() override;
     void blitH(int x, int y, int width) override;
     virtual void blitAntiH(int x, int y, const SkAlpha* antialias,
                            const int16_t* runs) override;
@@ -133,7 +133,7 @@
 public:
     SkRGB16_Shader_Xfermode_Blitter(const SkPixmap& device, const SkPaint& paint,
                                     SkShader::Context* shaderContext);
-    virtual ~SkRGB16_Shader_Xfermode_Blitter();
+    ~SkRGB16_Shader_Xfermode_Blitter() override;
     void blitH(int x, int y, int width) override;
     virtual void blitAntiH(int x, int y, const SkAlpha* antialias,
                            const int16_t* runs) override;
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 85392dd..0e8b819 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -85,7 +85,7 @@
 public:
     SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
                         SkShader::Context* shaderContext);
-    virtual ~SkA8_Shader_Blitter();
+    ~SkA8_Shader_Blitter() override;
     void blitH(int x, int y, int width) override;
     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override;
     void blitMask(const SkMask&, const SkIRect&) override;
@@ -156,7 +156,7 @@
 public:
     SkARGB32_Shader_Blitter(const SkPixmap& device, const SkPaint& paint,
                             SkShader::Context* shaderContext);
-    virtual ~SkARGB32_Shader_Blitter();
+    ~SkARGB32_Shader_Blitter() override;
     void blitH(int x, int y, int width) override;
     void blitV(int x, int y, int height, SkAlpha alpha) override;
     void blitRect(int x, int y, int width, int height) override;
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 03ca87e..689e5b7 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -1697,7 +1697,7 @@
     class TriColorShaderContext : public SkShader::Context {
     public:
         TriColorShaderContext(const SkTriColorShader& shader, const ContextRec&);
-        virtual ~TriColorShaderContext();
+        ~TriColorShaderContext() override;
         void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
 
     private:
diff --git a/src/core/SkExecutor.cpp b/src/core/SkExecutor.cpp
index 5e94d1b..6144dfd 100644
--- a/src/core/SkExecutor.cpp
+++ b/src/core/SkExecutor.cpp
@@ -56,7 +56,7 @@
         }
     }
 
-    ~SkThreadPool() {
+    ~SkThreadPool() override {
         // Signal each thread that it's time to shut down.
         for (int i = 0; i < fThreads.count(); i++) {
             this->add(nullptr);
diff --git a/src/core/SkMaskCache.cpp b/src/core/SkMaskCache.cpp
index eb7c8f0..ccfae18 100644
--- a/src/core/SkMaskCache.cpp
+++ b/src/core/SkMaskCache.cpp
@@ -44,7 +44,7 @@
         fValue.fData = data;
         fValue.fData->attachToCacheAndRef();
     }
-    ~RRectBlurRec() {
+    ~RRectBlurRec() override {
         fValue.fData->detachFromCacheAndUnref();
     }
 
@@ -138,7 +138,7 @@
         fValue.fData = data;
         fValue.fData->attachToCacheAndRef();
     }
-    ~RectsBlurRec() {
+    ~RectsBlurRec() override {
         fValue.fData->detachFromCacheAndUnref();
     }
 
diff --git a/src/core/SkNormalBevelSource.h b/src/core/SkNormalBevelSource.h
index 1d1983c..2fefacd 100644
--- a/src/core/SkNormalBevelSource.h
+++ b/src/core/SkNormalBevelSource.h
@@ -34,7 +34,7 @@
     public:
         Provider();
 
-        virtual ~Provider();
+        ~Provider() override;
 
         void fillScanLine(int x, int y, SkPoint3 output[], int count) const override;
 
diff --git a/src/core/SkNormalFlatSource.h b/src/core/SkNormalFlatSource.h
index 4a8f743..82b56f1 100644
--- a/src/core/SkNormalFlatSource.h
+++ b/src/core/SkNormalFlatSource.h
@@ -31,7 +31,7 @@
     public:
         Provider();
 
-        virtual ~Provider();
+        ~Provider() override;
 
         void fillScanLine(int x, int y, SkPoint3 output[], int count) const override;
 
diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h
index 4e0bf46..dc9a002 100644
--- a/src/core/SkPictureRecord.h
+++ b/src/core/SkPictureRecord.h
@@ -30,7 +30,7 @@
 class SkPictureRecord : public SkCanvas {
 public:
     SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags);
-    virtual ~SkPictureRecord();
+    ~SkPictureRecord() override;
 
     const SkTDArray<const SkPicture* >& getPictureRefs() const {
         return fPictureRefs;
diff --git a/src/core/SkRTree.h b/src/core/SkRTree.h
index 499f7a5..0fb491e 100644
--- a/src/core/SkRTree.h
+++ b/src/core/SkRTree.h
@@ -38,7 +38,7 @@
      * create better proportioned tiles of rectangles.
      */
     explicit SkRTree(SkScalar aspectRatio = 1);
-    virtual ~SkRTree() {}
+    ~SkRTree() override {}
 
     void insert(const SkRect[], int N) override;
     void search(const SkRect& query, SkTDArray<int>* results) const override;
diff --git a/src/core/SkRWBuffer.cpp b/src/core/SkRWBuffer.cpp
index 4ef2d94..49967bd 100644
--- a/src/core/SkRWBuffer.cpp
+++ b/src/core/SkRWBuffer.cpp
@@ -272,7 +272,7 @@
         fGlobalOffset = fLocalOffset = 0;
     }
 
-    virtual ~SkROBufferStreamAsset() { fBuffer->unref(); }
+    ~SkROBufferStreamAsset() override { fBuffer->unref(); }
 
     size_t getLength() const override { return fBuffer->size(); }
 
diff --git a/src/core/SkRegion_path.cpp b/src/core/SkRegion_path.cpp
index 47df8f6..fec7825 100644
--- a/src/core/SkRegion_path.cpp
+++ b/src/core/SkRegion_path.cpp
@@ -26,7 +26,7 @@
 class SkRgnBuilder : public SkBlitter {
 public:
     SkRgnBuilder();
-    virtual ~SkRgnBuilder();
+    ~SkRgnBuilder() override;
 
     // returns true if it could allocate the working storage needed
     bool init(int maxHeight, int maxTransitions, bool pathIsInverse);
diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp
index e7c2f94..9f5bc25 100644
--- a/src/core/SkResourceCache.cpp
+++ b/src/core/SkResourceCache.cpp
@@ -91,7 +91,7 @@
     // The pixelref will ref() the colortable (if not NULL), and unref() in destructor
     SkOneShotDiscardablePixelRef(const SkImageInfo&, SkDiscardableMemory*, size_t rowBytes,
                                  SkColorTable*);
-    ~SkOneShotDiscardablePixelRef();
+    ~SkOneShotDiscardablePixelRef() override;
 
 protected:
     bool onNewLockPixels(LockRec*) override;
diff --git a/src/core/SkScan_AAAPath.cpp b/src/core/SkScan_AAAPath.cpp
index 499408a..3eca137 100644
--- a/src/core/SkScan_AAAPath.cpp
+++ b/src/core/SkScan_AAAPath.cpp
@@ -95,7 +95,7 @@
 
 class AdditiveBlitter : public SkBlitter {
 public:
-    virtual ~AdditiveBlitter() {}
+    ~AdditiveBlitter() override {}
 
     virtual SkBlitter* getRealBlitter(bool forceRealBlitter = false) = 0;
 
@@ -136,7 +136,7 @@
 public:
     MaskAdditiveBlitter(SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip,
             bool isInverse);
-    ~MaskAdditiveBlitter() {
+    ~MaskAdditiveBlitter() override {
         fRealBlitter->blitMask(fMask, fClipRect);
     }
 
@@ -278,7 +278,7 @@
 public:
     RunBasedAdditiveBlitter(SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip,
             bool isInverse);
-    ~RunBasedAdditiveBlitter();
+    ~RunBasedAdditiveBlitter() override;
 
     SkBlitter* getRealBlitter(bool forceRealBlitter) override;
 
diff --git a/src/core/SkScan_AntiPath.cpp b/src/core/SkScan_AntiPath.cpp
index 19989ff..ac4c8c3 100644
--- a/src/core/SkScan_AntiPath.cpp
+++ b/src/core/SkScan_AntiPath.cpp
@@ -104,7 +104,7 @@
 public:
     SuperBlitter(SkBlitter* realBlitter, const SkIRect& ir, const SkRegion& clip, bool isInverse);
 
-    virtual ~SuperBlitter() {
+    ~SuperBlitter() override {
         this->flush();
     }
 
@@ -394,7 +394,7 @@
 class MaskSuperBlitter : public BaseSuperBlitter {
 public:
     MaskSuperBlitter(SkBlitter* realBlitter, const SkIRect& ir, const SkRegion&, bool isInverse);
-    virtual ~MaskSuperBlitter() {
+    ~MaskSuperBlitter() override {
         fRealBlitter->blitMask(fMask, fClipRect);
     }
 
diff --git a/src/core/SkSpriteBlitter_ARGB32.cpp b/src/core/SkSpriteBlitter_ARGB32.cpp
index 6b6d8b1..3ecfcf4 100644
--- a/src/core/SkSpriteBlitter_ARGB32.cpp
+++ b/src/core/SkSpriteBlitter_ARGB32.cpp
@@ -81,7 +81,7 @@
         fAlpha = paint.getAlpha();
     }
 
-    virtual ~Sprite_D32_XferFilter() {
+    ~Sprite_D32_XferFilter() override {
         delete[] fBuffer;
         SkSafeUnref(fColorFilter);
     }
diff --git a/src/core/SkYUVPlanesCache.cpp b/src/core/SkYUVPlanesCache.cpp
index 07a07c6..a962d5a 100644
--- a/src/core/SkYUVPlanesCache.cpp
+++ b/src/core/SkYUVPlanesCache.cpp
@@ -39,7 +39,7 @@
         fValue.fInfo = *info;
         fValue.fData->attachToCacheAndRef();
     }
-    ~YUVPlanesRec() {
+    ~YUVPlanesRec() override {
         fValue.fData->detachFromCacheAndUnref();
     }
 
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
index e0b76a2..9bd159d 100644
--- a/src/effects/SkDisplacementMapEffect.cpp
+++ b/src/effects/SkDisplacementMapEffect.cpp
@@ -227,7 +227,7 @@
                                         colorDimensions));
     }
 
-    virtual ~GrDisplacementMapEffect();
+    ~GrDisplacementMapEffect() override;
 
     SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const {
         return fXChannelSelector;
diff --git a/src/effects/SkHighContrastFilter.cpp b/src/effects/SkHighContrastFilter.cpp
index 267a8ef..c3937cc 100644
--- a/src/effects/SkHighContrastFilter.cpp
+++ b/src/effects/SkHighContrastFilter.cpp
@@ -158,7 +158,7 @@
                                         1.0f - FLT_EPSILON);
     }
 
-    virtual ~SkHighContrast_Filter() { }
+    ~SkHighContrast_Filter() override {}
 
 #if SK_SUPPORT_GPU
     sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*, SkColorSpace*) const override;
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 34e7034..54b8cb1 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -702,7 +702,7 @@
 
 class GrGLDistantLight : public GrGLLight {
 public:
-    virtual ~GrGLDistantLight() {}
+    ~GrGLDistantLight() override {}
     void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
     void emitSurfaceToLight(GrGLSLUniformHandler*, GrGLSLFPFragmentBuilder*, const char* z) override;
 
@@ -715,7 +715,7 @@
 
 class GrGLPointLight : public GrGLLight {
 public:
-    virtual ~GrGLPointLight() {}
+    ~GrGLPointLight() override {}
     void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
     void emitSurfaceToLight(GrGLSLUniformHandler*, GrGLSLFPFragmentBuilder*, const char* z) override;
 
@@ -728,7 +728,7 @@
 
 class GrGLSpotLight : public GrGLLight {
 public:
-    virtual ~GrGLSpotLight() {}
+    ~GrGLSpotLight() override {}
     void setData(const GrGLSLProgramDataManager&, const SkImageFilterLight* light) const override;
     void emitSurfaceToLight(GrGLSLUniformHandler*, GrGLSLFPFragmentBuilder*, const char* z) override;
     void emitLightColor(GrGLSLUniformHandler*,
@@ -758,8 +758,6 @@
 
 class SkImageFilterLight : public SkRefCnt {
 public:
-
-
     enum LightType {
         kDistant_LightType,
         kPoint_LightType,
@@ -1630,7 +1628,7 @@
 class GrGLLightingEffect : public GrGLSLFragmentProcessor {
 public:
     GrGLLightingEffect() : fLight(nullptr) { }
-    virtual ~GrGLLightingEffect() { delete fLight; }
+    ~GrGLLightingEffect() override { delete fLight; }
 
     void emitCode(EmitArgs&) override;
 
diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp
index aa85d1b..1e02ced 100644
--- a/src/effects/SkPerlinNoiseShader.cpp
+++ b/src/effects/SkPerlinNoiseShader.cpp
@@ -497,7 +497,7 @@
                                     std::move(permutationsProxy), std::move(noiseProxy), matrix));
     }
 
-    virtual ~GrPerlinNoiseEffect() { delete fPaintingData; }
+    ~GrPerlinNoiseEffect() override { delete fPaintingData; }
 
     const char* name() const override { return "PerlinNoise"; }
 
diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp
index 393543b..f09d5ed 100644
--- a/src/effects/SkTableColorFilter.cpp
+++ b/src/effects/SkTableColorFilter.cpp
@@ -80,7 +80,7 @@
         }
     }
 
-    virtual ~SkTable_ColorFilter() { delete fBitmap; }
+    ~SkTable_ColorFilter() override { delete fBitmap; }
 
     bool asComponentTable(SkBitmap* table) const override;
     sk_sp<SkColorFilter> makeComposed(sk_sp<SkColorFilter> inner) const override;
diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h
index 7f1f5f8..f64b439 100644
--- a/src/effects/gradients/SkGradientShaderPriv.h
+++ b/src/effects/gradients/SkGradientShaderPriv.h
@@ -119,7 +119,7 @@
     };
 
     SkGradientShaderBase(const Descriptor& desc, const SkMatrix& ptsToUnit);
-    virtual ~SkGradientShaderBase();
+    ~SkGradientShaderBase() override;
 
     // The cache is initialized on-demand when getCache32 is called.
     class GradientShaderCache : public SkRefCnt {
@@ -353,7 +353,7 @@
 
     class GLSLProcessor;
 
-    virtual ~GrGradientEffect();
+    ~GrGradientEffect() override;
 
     bool useAtlas() const { return SkToBool(-1 != fRow); }
     SkScalar getYCoord() const { return fYCoord; }
diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp
index 1dbe2e7..b58cb29 100644
--- a/src/effects/gradients/SkLinearGradient.cpp
+++ b/src/effects/gradients/SkLinearGradient.cpp
@@ -421,7 +421,7 @@
         return sk_sp<GrFragmentProcessor>(new GrLinearGradient(args));
     }
 
-    virtual ~GrLinearGradient() { }
+    ~GrLinearGradient() override {}
 
     const char* name() const override { return "Linear Gradient"; }
 
@@ -446,7 +446,7 @@
 public:
     GLSLLinearProcessor(const GrProcessor&) {}
 
-    virtual ~GLSLLinearProcessor() { }
+    ~GLSLLinearProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp
index f282bab..2caf905 100644
--- a/src/effects/gradients/SkRadialGradient.cpp
+++ b/src/effects/gradients/SkRadialGradient.cpp
@@ -249,7 +249,7 @@
         return sk_sp<GrFragmentProcessor>(new GrRadialGradient(args));
     }
 
-    virtual ~GrRadialGradient() { }
+    ~GrRadialGradient() override {}
 
     const char* name() const override { return "Radial Gradient"; }
 
@@ -273,7 +273,7 @@
 class GrRadialGradient::GLSLRadialProcessor : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLRadialProcessor(const GrProcessor&) {}
-    virtual ~GLSLRadialProcessor() { }
+    ~GLSLRadialProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp
index 928de4c..79013b3 100644
--- a/src/effects/gradients/SkSweepGradient.cpp
+++ b/src/effects/gradients/SkSweepGradient.cpp
@@ -131,7 +131,7 @@
     static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
         return sk_sp<GrFragmentProcessor>(new GrSweepGradient(args));
     }
-    virtual ~GrSweepGradient() { }
+    ~GrSweepGradient() override {}
 
     const char* name() const override { return "Sweep Gradient"; }
 
@@ -155,7 +155,7 @@
 class GrSweepGradient::GLSLSweepProcessor : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLSweepProcessor(const GrProcessor&) {}
-    virtual ~GLSLSweepProcessor() { }
+    ~GLSLSweepProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
diff --git a/src/effects/gradients/SkTwoPointConicalGradient.h b/src/effects/gradients/SkTwoPointConicalGradient.h
index e509f92..d73ba11 100644
--- a/src/effects/gradients/SkTwoPointConicalGradient.h
+++ b/src/effects/gradients/SkTwoPointConicalGradient.h
@@ -47,7 +47,7 @@
     class TwoPointConicalGradientContext : public SkGradientShaderBase::GradientShaderBaseContext {
     public:
         TwoPointConicalGradientContext(const SkTwoPointConicalGradient&, const ContextRec&);
-        ~TwoPointConicalGradientContext() {}
+        ~TwoPointConicalGradientContext() override {}
 
         void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
 
diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
index 3bf9c1e..9ac8528 100644
--- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
+++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
@@ -65,7 +65,7 @@
         return sk_sp<GrFragmentProcessor>(new Edge2PtConicalEffect(args));
     }
 
-    virtual ~Edge2PtConicalEffect() {}
+    ~Edge2PtConicalEffect() override {}
 
     const char* name() const override {
         return "Two-Point Conical Gradient Edge Touching";
@@ -139,7 +139,7 @@
 class Edge2PtConicalEffect::GLSLEdge2PtConicalProcessor : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLEdge2PtConicalProcessor(const GrProcessor&);
-    virtual ~GLSLEdge2PtConicalProcessor() { }
+    ~GLSLEdge2PtConicalProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
@@ -375,7 +375,7 @@
             new FocalOutside2PtConicalEffect(args, focalX));
     }
 
-    virtual ~FocalOutside2PtConicalEffect() { }
+    ~FocalOutside2PtConicalEffect() override {}
 
     const char* name() const override {
         return "Two-Point Conical Gradient Focal Outside";
@@ -420,7 +420,7 @@
     : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLFocalOutside2PtConicalProcessor(const GrProcessor&);
-    virtual ~GLSLFocalOutside2PtConicalProcessor() { }
+    ~GLSLFocalOutside2PtConicalProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
@@ -589,7 +589,7 @@
             new FocalInside2PtConicalEffect(args, focalX));
     }
 
-    virtual ~FocalInside2PtConicalEffect() {}
+    ~FocalInside2PtConicalEffect() override {}
 
     const char* name() const override {
         return "Two-Point Conical Gradient Focal Inside";
@@ -626,7 +626,7 @@
     : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLFocalInside2PtConicalProcessor(const GrProcessor&);
-    virtual ~GLSLFocalInside2PtConicalProcessor() {}
+    ~GLSLFocalInside2PtConicalProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
@@ -828,7 +828,7 @@
             new CircleInside2PtConicalEffect(args, info));
     }
 
-    virtual ~CircleInside2PtConicalEffect() {}
+    ~CircleInside2PtConicalEffect() override {}
 
     const char* name() const override { return "Two-Point Conical Gradient Inside"; }
 
@@ -869,7 +869,7 @@
     : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLCircleInside2PtConicalProcessor(const GrProcessor&);
-    virtual ~GLSLCircleInside2PtConicalProcessor() {}
+    ~GLSLCircleInside2PtConicalProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
@@ -1044,7 +1044,7 @@
             new CircleOutside2PtConicalEffect(args, info));
     }
 
-    virtual ~CircleOutside2PtConicalEffect() {}
+    ~CircleOutside2PtConicalEffect() override {}
 
     const char* name() const override { return "Two-Point Conical Gradient Outside"; }
 
@@ -1100,7 +1100,7 @@
     : public GrGradientEffect::GLSLProcessor {
 public:
     GLSLCircleOutside2PtConicalProcessor(const GrProcessor&);
-    virtual ~GLSLCircleOutside2PtConicalProcessor() {}
+    ~GLSLCircleOutside2PtConicalProcessor() override {}
 
     virtual void emitCode(EmitArgs&) override;
 
diff --git a/src/gpu/GrRectanizer_pow2.h b/src/gpu/GrRectanizer_pow2.h
index 424d22e..b8cc0a1 100644
--- a/src/gpu/GrRectanizer_pow2.h
+++ b/src/gpu/GrRectanizer_pow2.h
@@ -24,7 +24,7 @@
         this->reset();
     }
 
-    virtual ~GrRectanizerPow2() { }
+    ~GrRectanizerPow2() override {}
 
     void reset() override {
         fNextStripY = 0;
diff --git a/src/gpu/effects/GrBezierEffect.h b/src/gpu/effects/GrBezierEffect.h
index f908551..3a130ec 100644
--- a/src/gpu/effects/GrBezierEffect.h
+++ b/src/gpu/effects/GrBezierEffect.h
@@ -89,7 +89,7 @@
         }
     }
 
-    virtual ~GrConicEffect();
+    ~GrConicEffect() override;
 
     const char* name() const override { return "Conic"; }
 
@@ -171,7 +171,7 @@
         }
     }
 
-    virtual ~GrQuadEffect();
+    ~GrQuadEffect() override;
 
     const char* name() const override { return "Quad"; }
 
@@ -248,7 +248,7 @@
         }
     }
 
-    virtual ~GrCubicEffect();
+    ~GrCubicEffect() override;
 
     const char* name() const override { return "Cubic"; }
 
diff --git a/src/gpu/effects/GrBicubicEffect.h b/src/gpu/effects/GrBicubicEffect.h
index ed22ba1..e24422f 100644
--- a/src/gpu/effects/GrBicubicEffect.h
+++ b/src/gpu/effects/GrBicubicEffect.h
@@ -20,7 +20,7 @@
         kFilterTexelPad = 2, // Given a src rect in texels to be filtered, this number of
                              // surrounding texels are needed by the kernel in x and y.
     };
-    virtual ~GrBicubicEffect();
+    ~GrBicubicEffect() override;
 
     const char* name() const override { return "Bicubic"; }
 
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.h b/src/gpu/effects/GrBitmapTextGeoProc.h
index 2221e8a..aa9afc2 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.h
+++ b/src/gpu/effects/GrBitmapTextGeoProc.h
@@ -30,7 +30,7 @@
                                     localMatrix, usesLocalCoords));
     }
 
-    virtual ~GrBitmapTextGeoProc() {}
+    ~GrBitmapTextGeoProc() override {}
 
     const char* name() const override { return "Texture"; }
 
diff --git a/src/gpu/effects/GrConvexPolyEffect.h b/src/gpu/effects/GrConvexPolyEffect.h
index 89a8124..34f8b22 100644
--- a/src/gpu/effects/GrConvexPolyEffect.h
+++ b/src/gpu/effects/GrConvexPolyEffect.h
@@ -57,7 +57,7 @@
      */
     static sk_sp<GrFragmentProcessor> Make(GrPrimitiveEdgeType, const SkRect&);
 
-    virtual ~GrConvexPolyEffect();
+    ~GrConvexPolyEffect() override;
 
     const char* name() const override { return "ConvexPoly"; }
 
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.h b/src/gpu/effects/GrDistanceFieldGeoProc.h
index cf5d5f9..1384d2f 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.h
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.h
@@ -70,7 +70,7 @@
     }
 #endif
 
-    virtual ~GrDistanceFieldA8TextGeoProc() {}
+    ~GrDistanceFieldA8TextGeoProc() override {}
 
     const char* name() const override { return "DistanceFieldA8Text"; }
 
diff --git a/src/gpu/effects/GrDitherEffect.cpp b/src/gpu/effects/GrDitherEffect.cpp
index adae12c..864a5d2 100644
--- a/src/gpu/effects/GrDitherEffect.cpp
+++ b/src/gpu/effects/GrDitherEffect.cpp
@@ -20,7 +20,7 @@
         return sk_sp<GrFragmentProcessor>(new DitherEffect);
     }
 
-    virtual ~DitherEffect() {}
+    ~DitherEffect() override {}
 
     const char* name() const override { return "Dither"; }
 
diff --git a/src/gpu/effects/GrOvalEffect.cpp b/src/gpu/effects/GrOvalEffect.cpp
index 62b1c52..a8b0c84 100644
--- a/src/gpu/effects/GrOvalEffect.cpp
+++ b/src/gpu/effects/GrOvalEffect.cpp
@@ -23,7 +23,7 @@
     static sk_sp<GrFragmentProcessor> Make(GrPrimitiveEdgeType, const SkPoint& center,
                                            SkScalar radius);
 
-    virtual ~CircleEffect() {}
+    ~CircleEffect() override {}
 
     const char* name() const override { return "Circle"; }
 
@@ -185,7 +185,7 @@
     static sk_sp<GrFragmentProcessor> Make(GrPrimitiveEdgeType, const SkPoint& center,
                                            SkScalar rx, SkScalar ry);
 
-    virtual ~EllipseEffect() {}
+    ~EllipseEffect() override {}
 
     const char* name() const override { return "Ellipse"; }
 
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
index f984355..3dc5325 100644
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
@@ -589,7 +589,7 @@
 public:
     GLPDLCDXferProcessor(const GrProcessor&) : fLastAlpha(SK_MaxU32) {}
 
-    virtual ~GLPDLCDXferProcessor() {}
+    ~GLPDLCDXferProcessor() override {}
 
     static void GenKey(const GrProcessor& processor, const GrShaderCaps& caps,
                        GrProcessorKeyBuilder* b) {}
diff --git a/src/gpu/effects/GrRRectEffect.cpp b/src/gpu/effects/GrRRectEffect.cpp
index 7253de8..1b4772d 100644
--- a/src/gpu/effects/GrRRectEffect.cpp
+++ b/src/gpu/effects/GrRRectEffect.cpp
@@ -48,7 +48,7 @@
     static sk_sp<GrFragmentProcessor> Make(GrPrimitiveEdgeType, uint32_t circularCornerFlags,
                                            const SkRRect&);
 
-    virtual ~CircularRRectEffect() {}
+    ~CircularRRectEffect() override {}
 
     const char* name() const override { return "CircularRRect"; }
 
@@ -387,7 +387,7 @@
 public:
     static sk_sp<GrFragmentProcessor> Make(GrPrimitiveEdgeType, const SkRRect&);
 
-    virtual ~EllipticalRRectEffect() {}
+    ~EllipticalRRectEffect() override {}
 
     const char* name() const override { return "EllipticalRRect"; }
 
diff --git a/src/gpu/effects/GrSimpleTextureEffect.h b/src/gpu/effects/GrSimpleTextureEffect.h
index 69b8749..b3030bf 100644
--- a/src/gpu/effects/GrSimpleTextureEffect.h
+++ b/src/gpu/effects/GrSimpleTextureEffect.h
@@ -80,7 +80,7 @@
                                                                     matrix, p));
     }
 
-    virtual ~GrSimpleTextureEffect() {}
+    ~GrSimpleTextureEffect() override {}
 
     const char* name() const override { return "SimpleTexture"; }
 
diff --git a/src/gpu/gl/GrGLBuffer.h b/src/gpu/gl/GrGLBuffer.h
index 6a90d03..3400819 100644
--- a/src/gpu/gl/GrGLBuffer.h
+++ b/src/gpu/gl/GrGLBuffer.h
@@ -19,7 +19,7 @@
     static GrGLBuffer* Create(GrGLGpu*, size_t size, GrBufferType intendedType, GrAccessPattern,
                               const void* data = nullptr);
 
-    ~GrGLBuffer() {
+    ~GrGLBuffer() override {
         // either release or abandon should have been called by the owner of this object.
         SkASSERT(0 == fBufferID);
     }
diff --git a/src/gpu/gl/GrGLGpuCommandBuffer.h b/src/gpu/gl/GrGLGpuCommandBuffer.h
index 519272f..73deba3 100644
--- a/src/gpu/gl/GrGLGpuCommandBuffer.h
+++ b/src/gpu/gl/GrGLGpuCommandBuffer.h
@@ -24,7 +24,7 @@
 public:
     GrGLGpuCommandBuffer(GrGLGpu* gpu) : fGpu(gpu), fRenderTarget(nullptr) {}
 
-    virtual ~GrGLGpuCommandBuffer() {}
+    ~GrGLGpuCommandBuffer() override {}
 
     void end() override {}
 
diff --git a/src/gpu/gl/GrGLPathRendering.h b/src/gpu/gl/GrGLPathRendering.h
index d7a7dbf..8c3cd47 100644
--- a/src/gpu/gl/GrGLPathRendering.h
+++ b/src/gpu/gl/GrGLPathRendering.h
@@ -31,7 +31,7 @@
      * Create a new GrGLPathRendering object from a given GrGLGpu.
      */
     GrGLPathRendering(GrGLGpu* gpu);
-    virtual ~GrGLPathRendering();
+    ~GrGLPathRendering() override;
 
     // GrPathRendering implementations.
     GrPath* createPath(const SkPath&, const GrStyle&) override;
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp
index ba2b00e..e316fec 100644
--- a/src/gpu/ops/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp
@@ -530,7 +530,7 @@
         return sk_sp<GrGeometryProcessor>(new QuadEdgeEffect(color, localMatrix, usesLocalCoords));
     }
 
-    virtual ~QuadEdgeEffect() {}
+    ~QuadEdgeEffect() override {}
 
     const char* name() const override { return "QuadEdge"; }
 
diff --git a/src/gpu/ops/GrAnalyticRectOp.cpp b/src/gpu/ops/GrAnalyticRectOp.cpp
index 5dbfd5e..45e20f0 100644
--- a/src/gpu/ops/GrAnalyticRectOp.cpp
+++ b/src/gpu/ops/GrAnalyticRectOp.cpp
@@ -69,7 +69,7 @@
 
     const SkMatrix& localMatrix() const { return fLocalMatrix; }
 
-    virtual ~RectGeometryProcessor() {}
+    ~RectGeometryProcessor() override {}
 
     const char* name() const override { return "RectEdge"; }
 
diff --git a/src/gpu/ops/GrMSAAPathRenderer.cpp b/src/gpu/ops/GrMSAAPathRenderer.cpp
index 04b0b14..ccbd0e2 100644
--- a/src/gpu/ops/GrMSAAPathRenderer.cpp
+++ b/src/gpu/ops/GrMSAAPathRenderer.cpp
@@ -116,7 +116,7 @@
         return new MSAAQuadProcessor(viewMatrix);
     }
 
-    virtual ~MSAAQuadProcessor() {}
+    ~MSAAQuadProcessor() override {}
 
     const char* name() const override { return "MSAAQuadProcessor"; }
 
diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp
index 8ab33f5..dbab985 100644
--- a/src/gpu/ops/GrOvalOpFactory.cpp
+++ b/src/gpu/ops/GrOvalOpFactory.cpp
@@ -103,7 +103,7 @@
 
     bool implementsDistanceVector() const override { return !fInClipPlane; }
 
-    virtual ~CircleGeometryProcessor() {}
+    ~CircleGeometryProcessor() override {}
 
     const char* name() const override { return "CircleEdge"; }
 
@@ -274,7 +274,7 @@
         fStroke = stroke;
     }
 
-    virtual ~EllipseGeometryProcessor() {}
+    ~EllipseGeometryProcessor() override {}
 
     const char* name() const override { return "EllipseEdge"; }
 
@@ -416,7 +416,7 @@
         fStyle = style;
     }
 
-    virtual ~DIEllipseGeometryProcessor() {}
+    ~DIEllipseGeometryProcessor() override {}
 
     const char* name() const override { return "DIEllipseEdge"; }
 
diff --git a/src/gpu/ops/GrSmallPathRenderer.h b/src/gpu/ops/GrSmallPathRenderer.h
index ba752d0..d43da83 100644
--- a/src/gpu/ops/GrSmallPathRenderer.h
+++ b/src/gpu/ops/GrSmallPathRenderer.h
@@ -21,7 +21,7 @@
 class GrSmallPathRenderer : public GrPathRenderer {
 public:
     GrSmallPathRenderer();
-    virtual ~GrSmallPathRenderer();
+    ~GrSmallPathRenderer() override;
 
 private:
     StencilSupport onGetStencilSupport(const GrShape&) const override {
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.h b/src/gpu/vk/GrVkGpuCommandBuffer.h
index d3eece3..93370fe 100644
--- a/src/gpu/vk/GrVkGpuCommandBuffer.h
+++ b/src/gpu/vk/GrVkGpuCommandBuffer.h
@@ -27,7 +27,7 @@
                          const LoadAndStoreInfo& colorInfo,
                          const LoadAndStoreInfo& stencilInfo);
 
-    virtual ~GrVkGpuCommandBuffer();
+    ~GrVkGpuCommandBuffer() override;
 
     void end() override;
 
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index 6f3a54d..1428589 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -74,7 +74,7 @@
     }
 
     SkImage_Raster(const SkImageInfo&, sk_sp<SkData>, size_t rb, SkColorTable*);
-    virtual ~SkImage_Raster();
+    ~SkImage_Raster() override;
 
     SkImageInfo onImageInfo() const override {
         return fBitmap.info();
diff --git a/src/image/SkSurface_Gpu.h b/src/image/SkSurface_Gpu.h
index 5b92eeb..cc8b87d 100644
--- a/src/image/SkSurface_Gpu.h
+++ b/src/image/SkSurface_Gpu.h
@@ -17,7 +17,7 @@
 class SkSurface_Gpu : public SkSurface_Base {
 public:
     SkSurface_Gpu(sk_sp<SkGpuDevice>);
-    virtual ~SkSurface_Gpu();
+    ~SkSurface_Gpu() override;
 
     GrBackendObject onGetTextureHandle(BackendHandleAccess) override;
     bool onGetRenderTargetHandle(GrBackendObject*, BackendHandleAccess) override;
diff --git a/src/lazy/SkDiscardableMemoryPool.cpp b/src/lazy/SkDiscardableMemoryPool.cpp
index fece7f0..2cb1b3f 100644
--- a/src/lazy/SkDiscardableMemoryPool.cpp
+++ b/src/lazy/SkDiscardableMemoryPool.cpp
@@ -31,7 +31,7 @@
      *  Without mutex, will be not be thread safe.
      */
     DiscardableMemoryPool(size_t budget, SkBaseMutex* mutex = nullptr);
-    virtual ~DiscardableMemoryPool();
+    ~DiscardableMemoryPool() override;
 
     SkDiscardableMemory* create(size_t bytes) override;
 
@@ -80,7 +80,7 @@
 public:
     PoolDiscardableMemory(DiscardableMemoryPool* pool,
                             void* pointer, size_t bytes);
-    virtual ~PoolDiscardableMemory();
+    ~PoolDiscardableMemory() override;
     bool lock() override;
     void* data() override;
     void unlock() override;
diff --git a/src/pdf/SkDeflate.h b/src/pdf/SkDeflate.h
index 387de40..be76a1d 100644
--- a/src/pdf/SkDeflate.h
+++ b/src/pdf/SkDeflate.h
@@ -35,7 +35,7 @@
                      bool gzip = false);
 
     /** The destructor calls finalize(). */
-    ~SkDeflateWStream();
+    ~SkDeflateWStream() override;
 
     /** Write the end of the compressed stream.  All subsequent calls to
         write() will fail. Subsequent calls to finalize() do nothing. */
diff --git a/src/pdf/SkPDFCanvas.h b/src/pdf/SkPDFCanvas.h
index 7c4d26f..93c055a 100644
--- a/src/pdf/SkPDFCanvas.h
+++ b/src/pdf/SkPDFCanvas.h
@@ -14,7 +14,7 @@
 class SkPDFCanvas : public SkCanvas {
 public:
     SkPDFCanvas(const sk_sp<SkPDFDevice>&);
-    ~SkPDFCanvas();
+    ~SkPDFCanvas() override;
 
 protected:
     void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
diff --git a/src/pdf/SkPDFDevice.h b/src/pdf/SkPDFDevice.h
index 303d450..93eb78d 100644
--- a/src/pdf/SkPDFDevice.h
+++ b/src/pdf/SkPDFDevice.h
@@ -72,7 +72,7 @@
         return new SkPDFDevice(pageSize, rasterDpi, doc, false);
     }
 
-    virtual ~SkPDFDevice();
+    ~SkPDFDevice() override;
 
     /** These are called inside the per-device-layer loop for each draw call.
      When these are called, we have already applied any saveLayer operations,
diff --git a/src/pdf/SkPDFDocument.h b/src/pdf/SkPDFDocument.h
index 15e1479..aa6dcb2 100644
--- a/src/pdf/SkPDFDocument.h
+++ b/src/pdf/SkPDFDocument.h
@@ -50,7 +50,7 @@
                   const SkDocument::PDFMetadata&,
                   sk_sp<SkPixelSerializer>,
                   bool);
-    virtual ~SkPDFDocument();
+    ~SkPDFDocument() override;
     SkCanvas* onBeginPage(SkScalar, SkScalar, const SkRect&) override;
     void onEndPage() override;
     void onClose(SkWStream*) override;
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
index 41b0d4d..09d133e 100644
--- a/src/pdf/SkPDFFont.cpp
+++ b/src/pdf/SkPDFFont.cpp
@@ -51,7 +51,7 @@
 
 struct SkPDFType0Font final : public SkPDFFont {
     SkPDFType0Font(SkPDFFont::Info, const SkAdvancedTypefaceMetrics&);
-    virtual ~SkPDFType0Font();
+    ~SkPDFType0Font() override;
     void getFontSubset(SkPDFCanon*) override;
 #ifdef SK_DEBUG
     void emitObject(SkWStream*, const SkPDFObjNumMap&) const override;
@@ -62,13 +62,13 @@
 
 struct SkPDFType1Font final : public SkPDFFont {
     SkPDFType1Font(SkPDFFont::Info, const SkAdvancedTypefaceMetrics&, SkPDFCanon*);
-    virtual ~SkPDFType1Font() {}
+    ~SkPDFType1Font() override {}
     void getFontSubset(SkPDFCanon*) override {} // TODO(halcanary): implement
 };
 
 struct SkPDFType3Font final : public SkPDFFont {
     SkPDFType3Font(SkPDFFont::Info, const SkAdvancedTypefaceMetrics&);
-    virtual ~SkPDFType3Font() {}
+    ~SkPDFType3Font() override {}
     void getFontSubset(SkPDFCanon*) override;
 };
 
diff --git a/src/pdf/SkPDFFont.h b/src/pdf/SkPDFFont.h
index 3858b64..67786f3 100644
--- a/src/pdf/SkPDFFont.h
+++ b/src/pdf/SkPDFFont.h
@@ -29,7 +29,7 @@
 class SkPDFFont : public SkPDFDict {
 
 public:
-    virtual ~SkPDFFont();
+    ~SkPDFFont() override;
 
     /** Returns the typeface represented by this class. Returns nullptr for the
      *  default typeface.
diff --git a/src/pdf/SkPDFTypes.h b/src/pdf/SkPDFTypes.h
index 201d62b..0be20f1 100644
--- a/src/pdf/SkPDFTypes.h
+++ b/src/pdf/SkPDFTypes.h
@@ -187,7 +187,7 @@
     /** Create a PDF array. Maximum length is 8191.
      */
     SkPDFArray();
-    virtual ~SkPDFArray();
+    ~SkPDFArray() override;
 
     // The SkPDFObject interface.
     void emitObject(SkWStream* stream,
@@ -235,7 +235,7 @@
      */
     explicit SkPDFDict(const char type[] = nullptr);
 
-    virtual ~SkPDFDict();
+    ~SkPDFDict() override;
 
     // The SkPDFObject interface.
     void emitObject(SkWStream* stream,
@@ -298,7 +298,7 @@
 class SkPDFSharedStream final : public SkPDFObject {
 public:
     SkPDFSharedStream(std::unique_ptr<SkStreamAsset> data);
-    ~SkPDFSharedStream();
+    ~SkPDFSharedStream() override;
     SkPDFDict* dict() { return &fDict; }
     void emitObject(SkWStream*,
                     const SkPDFObjNumMap&) const override;
@@ -327,7 +327,7 @@
      *  @param stream The data part of the stream. */
     explicit SkPDFStream(sk_sp<SkData> data);
     explicit SkPDFStream(std::unique_ptr<SkStreamAsset> stream);
-    virtual ~SkPDFStream();
+    ~SkPDFStream() override;
 
     SkPDFDict* dict() { return &fDict; }
 
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp
index 9e3a7d3..5489996 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -450,7 +450,7 @@
     SkScalerContext_FreeType(sk_sp<SkTypeface>,
                              const SkScalerContextEffects&,
                              const SkDescriptor* desc);
-    virtual ~SkScalerContext_FreeType();
+    ~SkScalerContext_FreeType() override;
 
     bool success() const {
         return fFTSize != nullptr && fFace != nullptr;
diff --git a/src/ports/SkFontMgr_fontconfig.cpp b/src/ports/SkFontMgr_fontconfig.cpp
index 85230b3..bceb4de 100644
--- a/src/ports/SkFontMgr_fontconfig.cpp
+++ b/src/ports/SkFontMgr_fontconfig.cpp
@@ -503,7 +503,7 @@
         return info;
     }
 
-    virtual ~SkTypeface_fontconfig() {
+    ~SkTypeface_fontconfig() override {
         // Hold the lock while unrefing the pattern.
         FCLocker lock;
         fPattern.reset();
@@ -534,7 +534,7 @@
             : fFontMgr(SkRef(parent)), fFontSet(fontSet)
         { }
 
-        virtual ~StyleSet() {
+        ~StyleSet() override {
             // Hold the lock while unrefing the font set.
             FCLocker lock;
             fFontSet.reset();
@@ -667,7 +667,7 @@
         : fFC(config ? config : FcInitLoadConfigAndFonts())
         , fFamilyNames(GetFamilyNames(fFC)) { }
 
-    virtual ~SkFontMgr_fontconfig() {
+    ~SkFontMgr_fontconfig() override {
         // Hold the lock while unrefing the config.
         FCLocker lock;
         fFC.reset();
diff --git a/src/sksl/SkSLCompiler.h b/src/sksl/SkSLCompiler.h
index 497d06d..ec02c5a 100644
--- a/src/sksl/SkSLCompiler.h
+++ b/src/sksl/SkSLCompiler.h
@@ -40,7 +40,7 @@
 public:
     Compiler();
 
-    ~Compiler();
+    ~Compiler() override;
 
     std::unique_ptr<Program> convertProgram(Program::Kind kind, SkString text,
                                             const Program::Settings& settings);
diff --git a/src/svg/SkSVGDevice.h b/src/svg/SkSVGDevice.h
index 092ef28..e05dc92 100644
--- a/src/svg/SkSVGDevice.h
+++ b/src/svg/SkSVGDevice.h
@@ -52,7 +52,7 @@
 
 private:
     SkSVGDevice(const SkISize& size, SkXMLWriter* writer);
-    virtual ~SkSVGDevice();
+    ~SkSVGDevice() override;
 
     struct MxCp;
     void drawBitmapCommon(const MxCp&, const SkBitmap& bm, const SkPaint& paint);
diff --git a/src/utils/SkCanvasStack.h b/src/utils/SkCanvasStack.h
index cdeeb84..22cfc3e 100644
--- a/src/utils/SkCanvasStack.h
+++ b/src/utils/SkCanvasStack.h
@@ -21,7 +21,7 @@
 class SkCanvasStack : public SkNWayCanvas {
 public:
     SkCanvasStack(int width, int height);
-    virtual ~SkCanvasStack();
+    ~SkCanvasStack() override;
 
     void pushCanvas(std::unique_ptr<SkCanvas>, const SkIPoint& origin);
     void removeAll() override;
diff --git a/src/utils/SkMultiPictureDocument.cpp b/src/utils/SkMultiPictureDocument.cpp
index 217e7a3..d987818 100644
--- a/src/utils/SkMultiPictureDocument.cpp
+++ b/src/utils/SkMultiPictureDocument.cpp
@@ -46,7 +46,7 @@
     SkTArray<SkSize> fSizes;
     MultiPictureDocument(SkWStream* s, void (*d)(SkWStream*, bool))
         : SkDocument(s, d) {}
-    ~MultiPictureDocument() { this->close(); }
+    ~MultiPictureDocument() override { this->close(); }
 
     SkCanvas* onBeginPage(SkScalar w, SkScalar h, const SkRect& c) override {
         fCurrentPageSize.set(w, h);
diff --git a/src/xml/SkXMLWriter.h b/src/xml/SkXMLWriter.h
index b1d513c..c500e16 100644
--- a/src/xml/SkXMLWriter.h
+++ b/src/xml/SkXMLWriter.h
@@ -64,7 +64,7 @@
 class SkXMLStreamWriter : public SkXMLWriter {
 public:
     SkXMLStreamWriter(SkWStream*);
-    virtual ~SkXMLStreamWriter();
+    ~SkXMLStreamWriter() override;
     void writeHeader() override;
 
 protected:
@@ -80,7 +80,7 @@
 class SkXMLParserWriter : public SkXMLWriter {
 public:
     SkXMLParserWriter(SkXMLParser*);
-    virtual ~SkXMLParserWriter();
+    ~SkXMLParserWriter() override;
 protected:
     void onStartElementLen(const char elem[], size_t length) override;
     void onEndElement() override;