diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index fd7fb87..9a84c34 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -187,17 +187,17 @@
         m_option_group.Finalize();
     }
 
-    ~CommandObjectTargetCreate ()
+    ~CommandObjectTargetCreate () override
     {
     }
 
     Options *
-    GetOptions ()
+    GetOptions () override
     {
         return &m_option_group;
     }
 
-    virtual int
+    int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
@@ -205,7 +205,7 @@
                               int match_start_point,
                               int max_return_elements,
                               bool &word_complete,
-                              StringList &matches)
+                              StringList &matches) override
     {
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
@@ -223,7 +223,7 @@
 
 protected:
     bool
-    DoExecute (Args& command, CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         const size_t argc = command.GetArgumentCount();
         FileSpec core_file (m_core_file.GetOptionValue().GetCurrentValue());
@@ -477,14 +477,13 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetList ()
+    ~CommandObjectTargetList () override
     {
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& args, CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         if (args.GetArgumentCount() == 0)
         {
@@ -525,14 +524,13 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetSelect ()
+    ~CommandObjectTargetSelect () override
     {
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& args, CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         if (args.GetArgumentCount() == 1)
         {
@@ -622,20 +620,19 @@
         m_option_group.Finalize();
     }
 
-    virtual
-    ~CommandObjectTargetDelete ()
+    ~CommandObjectTargetDelete () override
     {
     }
 
     Options *
-    GetOptions ()
+    GetOptions () override
     {
         return &m_option_group;
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& args, CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         const size_t argc = args.GetArgumentCount();
         std::vector<TargetSP> delete_target_list;
@@ -777,8 +774,7 @@
         m_option_group.Finalize();
     }
 
-    virtual
-    ~CommandObjectTargetVariable ()
+    ~CommandObjectTargetVariable () override
     {
     }
 
@@ -850,7 +846,7 @@
     }
 
     Options *
-    GetOptions ()
+    GetOptions () override
     {
         return &m_option_group;
     }
@@ -896,8 +892,8 @@
         }
 
     }
-    virtual bool
-    DoExecute (Args& args, CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         Target *target = m_exe_ctx.GetTargetPtr();
         const size_t argc = args.GetArgumentCount();
@@ -1134,14 +1130,13 @@
         m_arguments.push_back (arg);
     }
 
-    ~CommandObjectTargetModulesSearchPathsAdd ()
+    ~CommandObjectTargetModulesSearchPathsAdd () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target)
@@ -1207,14 +1202,13 @@
     {
     }
 
-    ~CommandObjectTargetModulesSearchPathsClear ()
+    ~CommandObjectTargetModulesSearchPathsClear () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target)
@@ -1277,14 +1271,13 @@
         m_arguments.push_back (arg2);
     }
 
-    ~CommandObjectTargetModulesSearchPathsInsert ()
+    ~CommandObjectTargetModulesSearchPathsInsert () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target)
@@ -1366,14 +1359,13 @@
     {
     }
 
-    ~CommandObjectTargetModulesSearchPathsList ()
+    ~CommandObjectTargetModulesSearchPathsList () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target)
@@ -1423,14 +1415,13 @@
         m_arguments.push_back (arg);
     }
 
-    ~CommandObjectTargetModulesSearchPathsQuery ()
+    ~CommandObjectTargetModulesSearchPathsQuery () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target)
@@ -2062,12 +2053,11 @@
         m_arguments.push_back (arg);
     }
 
-    virtual
-    ~CommandObjectTargetModulesModuleAutoComplete ()
+    ~CommandObjectTargetModulesModuleAutoComplete () override
     {
     }
 
-    virtual int
+    int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
@@ -2075,7 +2065,7 @@
                               int match_start_point,
                               int max_return_elements,
                               bool &word_complete,
-                              StringList &matches)
+                              StringList &matches) override
     {
         // Arguments are the standard module completer.
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
@@ -2124,12 +2114,11 @@
         m_arguments.push_back (arg);
     }
 
-    virtual
-    ~CommandObjectTargetModulesSourceFileAutoComplete ()
+    ~CommandObjectTargetModulesSourceFileAutoComplete () override
     {
     }
 
-    virtual int
+    int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
@@ -2137,7 +2126,7 @@
                               int match_start_point,
                               int max_return_elements,
                               bool &word_complete,
-                              StringList &matches)
+                              StringList &matches) override
     {
         // Arguments are the standard source file completer.
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
@@ -2171,13 +2160,12 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetModulesDumpSymtab ()
+    ~CommandObjectTargetModulesDumpSymtab () override
     {
     }
 
-    virtual Options *
-    GetOptions ()
+    Options *
+    GetOptions () override
     {
         return &m_options;
     }
@@ -2191,13 +2179,12 @@
         {
         }
 
-        virtual
-        ~CommandOptions ()
+        ~CommandOptions () override
         {
         }
 
-        virtual Error
-        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg) override
         {
             Error error;
             const int short_option = m_getopt_table[option_idx].val;
@@ -2220,13 +2207,13 @@
         }
 
         void
-        OptionParsingStarting ()
+        OptionParsingStarting () override
         {
             m_sort_order = eSortOrderNone;
         }
 
         const OptionDefinition*
-        GetDefinitions ()
+        GetDefinitions () override
         {
             return g_option_table;
         }
@@ -2238,9 +2225,8 @@
     };
 
 protected:
-    virtual bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
@@ -2365,15 +2351,13 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetModulesDumpSections ()
+    ~CommandObjectTargetModulesDumpSections () override
     {
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
@@ -2471,15 +2455,13 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetModulesDumpSymfile ()
+    ~CommandObjectTargetModulesDumpSymfile () override
     {
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
@@ -2574,15 +2556,13 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetModulesDumpLineTable ()
+    ~CommandObjectTargetModulesDumpLineTable () override
     {
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_exe_ctx.GetTargetPtr();
         uint32_t total_num_dumped = 0;
@@ -2663,8 +2643,7 @@
         LoadSubCommand ("line-table",  CommandObjectSP (new CommandObjectTargetModulesDumpLineTable (interpreter)));
     }
 
-    virtual
-    ~CommandObjectTargetModulesDump()
+    ~CommandObjectTargetModulesDump() override
     {
     }
 };
@@ -2685,18 +2664,17 @@
         m_option_group.Finalize();
     }
 
-    virtual
-    ~CommandObjectTargetModulesAdd ()
+    ~CommandObjectTargetModulesAdd () override
     {
     }
 
-    virtual Options *
-    GetOptions ()
+    Options *
+    GetOptions () override
     {
         return &m_option_group;
     }
 
-    virtual int
+    int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
@@ -2704,7 +2682,7 @@
                               int match_start_point,
                               int max_return_elements,
                               bool &word_complete,
-                              StringList &matches)
+                              StringList &matches) override
     {
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
@@ -2725,9 +2703,8 @@
     OptionGroupUUID m_uuid_option_group;
     OptionGroupFile m_symbol_file;
 
-    virtual bool
-    DoExecute (Args& args,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
@@ -2888,21 +2865,19 @@
         m_option_group.Finalize();
     }
 
-    virtual
-    ~CommandObjectTargetModulesLoad ()
+    ~CommandObjectTargetModulesLoad () override
     {
     }
 
-    virtual Options *
-    GetOptions ()
+    Options *
+    GetOptions () override
     {
         return &m_option_group;
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& args,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
@@ -3145,13 +3120,12 @@
         {
         }
 
-        virtual
-        ~CommandOptions ()
+        ~CommandOptions () override
         {
         }
 
-        virtual Error
-        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg) override
         {
             Error error;
 
@@ -3176,7 +3150,7 @@
         }
 
         void
-        OptionParsingStarting ()
+        OptionParsingStarting () override
         {
             m_format_array.clear();
             m_use_global_module_list = false;
@@ -3184,7 +3158,7 @@
         }
 
         const OptionDefinition*
-        GetDefinitions ()
+        GetDefinitions () override
         {
             return g_option_table;
         }
@@ -3209,22 +3183,19 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetModulesList ()
+    ~CommandObjectTargetModulesList () override
     {
     }
 
-    virtual
     Options *
-    GetOptions ()
+    GetOptions () override
     {
         return &m_options;
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         const bool use_global_module_list = m_options.m_use_global_module_list;
@@ -3590,13 +3561,12 @@
         {
         }
 
-        virtual
-        ~CommandOptions ()
+        ~CommandOptions () override
         {
         }
 
-        virtual Error
-        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg) override
         {
             Error error;
 
@@ -3631,7 +3601,7 @@
         }
 
         void
-        OptionParsingStarting ()
+        OptionParsingStarting () override
         {
             m_type = eLookupTypeInvalid;
             m_str.clear();
@@ -3639,7 +3609,7 @@
         }
 
         const OptionDefinition*
-        GetDefinitions ()
+        GetDefinitions () override
         {
             return g_option_table;
         }
@@ -3668,22 +3638,19 @@
     {
     }
 
-    virtual
-    ~CommandObjectTargetModulesShowUnwind ()
+    ~CommandObjectTargetModulesShowUnwind () override
     {
     }
 
-    virtual
     Options *
-    GetOptions ()
+    GetOptions () override
     {
         return &m_options;
     }
 
 protected:
     bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_exe_ctx.GetTargetPtr();
         Process *process = m_exe_ctx.GetProcessPtr();
@@ -3905,13 +3872,12 @@
             OptionParsingStarting();
         }
 
-        virtual
-        ~CommandOptions ()
+        ~CommandOptions () override
         {
         }
 
-        virtual Error
-        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg) override
         {
             Error error;
 
@@ -3988,7 +3954,7 @@
         }
 
         void
-        OptionParsingStarting ()
+        OptionParsingStarting () override
         {
             m_type = eLookupTypeInvalid;
             m_str.clear();
@@ -4003,7 +3969,7 @@
         }
 
         const OptionDefinition*
-        GetDefinitions ()
+        GetDefinitions () override
         {
             return g_option_table;
         }
@@ -4045,13 +4011,12 @@
         m_arguments.push_back (arg);
     }
 
-    virtual
-    ~CommandObjectTargetModulesLookup ()
+    ~CommandObjectTargetModulesLookup () override
     {
     }
 
-    virtual Options *
-    GetOptions ()
+    Options *
+    GetOptions () override
     {
         return &m_options;
     }
@@ -4205,9 +4170,8 @@
     }
 
 protected:
-    virtual bool
-    DoExecute (Args& command,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
@@ -4353,7 +4317,7 @@
         LoadSubCommand ("query",   CommandObjectSP (new CommandObjectTargetModulesSearchPathsQuery (interpreter)));
     }
 
-    ~CommandObjectTargetModulesImageSearchPaths()
+    ~CommandObjectTargetModulesImageSearchPaths() override
     {
     }
 };
@@ -4387,8 +4351,8 @@
         LoadSubCommand ("show-unwind",  CommandObjectSP (new CommandObjectTargetModulesShowUnwind (interpreter)));
 
     }
-    virtual
-    ~CommandObjectTargetModules()
+
+    ~CommandObjectTargetModules() override
     {
     }
 
@@ -4420,12 +4384,11 @@
         m_option_group.Finalize();
     }
 
-    virtual
-    ~CommandObjectTargetSymbolsAdd ()
+    ~CommandObjectTargetSymbolsAdd () override
     {
     }
 
-    virtual int
+    int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
@@ -4433,7 +4396,7 @@
                               int match_start_point,
                               int max_return_elements,
                               bool &word_complete,
-                              StringList &matches)
+                              StringList &matches) override
     {
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
@@ -4449,8 +4412,8 @@
         return matches.GetSize();
     }
 
-    virtual Options *
-    GetOptions ()
+    Options *
+    GetOptions () override
     {
         return &m_option_group;
     }
@@ -4628,9 +4591,8 @@
         return false;
     }
 
-    virtual bool
-    DoExecute (Args& args,
-             CommandReturnObject &result)
+    bool
+    DoExecute (Args& args, CommandReturnObject &result) override
     {
         Target *target = m_exe_ctx.GetTargetPtr();
         result.SetStatus (eReturnStatusFailed);
@@ -4848,8 +4810,8 @@
         LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetSymbolsAdd (interpreter)));
 
     }
-    virtual
-    ~CommandObjectTargetSymbols()
+
+    ~CommandObjectTargetSymbols() override
     {
     }
 
@@ -4888,16 +4850,16 @@
         {
         }
 
-        ~CommandOptions () {}
+        ~CommandOptions () override {}
 
         const OptionDefinition*
-        GetDefinitions ()
+        GetDefinitions () override
         {
             return g_option_table;
         }
 
-        virtual Error
-        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg) override
         {
             Error error;
             const int short_option = m_getopt_table[option_idx].val;
@@ -4984,7 +4946,7 @@
         }
 
         void
-        OptionParsingStarting ()
+        OptionParsingStarting () override
         {
             m_class_name.clear();
             m_function_name.clear();
@@ -5029,7 +4991,7 @@
     };
 
     Options *
-    GetOptions ()
+    GetOptions () override
     {
         return &m_options;
     }
@@ -5044,13 +5006,13 @@
     {
     }
 
-    ~CommandObjectTargetStopHookAdd ()
+    ~CommandObjectTargetStopHookAdd () override
     {
     }
 
 protected:
-    virtual void
-    IOHandlerActivated (IOHandler &io_handler)
+    void
+    IOHandlerActivated (IOHandler &io_handler) override
     {
         StreamFileSP output_sp(io_handler.GetOutputStreamFile());
         if (output_sp)
@@ -5060,8 +5022,8 @@
         }
     }
 
-    virtual void
-    IOHandlerInputComplete (IOHandler &io_handler, std::string &line)
+    void
+    IOHandlerInputComplete (IOHandler &io_handler, std::string &line) override
     {
         if (m_stop_hook_sp)
         {
@@ -5093,7 +5055,7 @@
     }
 
     bool
-    DoExecute (Args& command, CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         m_stop_hook_sp.reset();
 
@@ -5241,13 +5203,13 @@
     {
     }
 
-    ~CommandObjectTargetStopHookDelete ()
+    ~CommandObjectTargetStopHookDelete () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command, CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = GetSelectedOrDummyTarget();
         if (target)
@@ -5317,13 +5279,13 @@
     {
     }
 
-    ~CommandObjectTargetStopHookEnableDisable ()
+    ~CommandObjectTargetStopHookEnableDisable () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command, CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = GetSelectedOrDummyTarget();
         if (target)
@@ -5387,13 +5349,13 @@
     {
     }
 
-    ~CommandObjectTargetStopHookList ()
+    ~CommandObjectTargetStopHookList () override
     {
     }
 
 protected:
     bool
-    DoExecute (Args& command, CommandReturnObject &result)
+    DoExecute (Args& command, CommandReturnObject &result) override
     {
         Target *target = GetSelectedOrDummyTarget();
         if (!target)
@@ -5453,7 +5415,7 @@
         LoadSubCommand ("list",     CommandObjectSP (new CommandObjectTargetStopHookList (interpreter)));
     }
 
-    ~CommandObjectMultiwordTargetStopHooks()
+    ~CommandObjectMultiwordTargetStopHooks() override
     {
     }
 };
