Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 5fda7143cbcbc2c8f66e8862aecc99dfa3619c54)
+++ src/GenPoly/Box.cc	(revision d0aa06e69e939030ae5bf7b928ed04f3806ff253)
@@ -64,31 +64,34 @@
 
 		/// Adds layout-generation functions to polymorphic types
-		class LayoutFunctionBuilder : public DeclMutator {
+		class LayoutFunctionBuilder final : public DeclMutator {
 			unsigned int functionNesting;  // current level of nested functions
 		public:
 			LayoutFunctionBuilder() : functionNesting( 0 ) {}
 
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual Declaration *mutate( StructDecl *structDecl );
-			virtual Declaration *mutate( UnionDecl *unionDecl );
+			using DeclMutator::mutate;
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual Declaration *mutate( StructDecl *structDecl ) override;
+			virtual Declaration *mutate( UnionDecl *unionDecl ) override;
 		};
 
 		/// Replaces polymorphic return types with out-parameters, replaces calls to polymorphic functions with adapter calls as needed, and adds appropriate type variables to the function call
-		class Pass1 : public PolyMutator {
+		class Pass1 final : public PolyMutator {
 		  public:
 			Pass1();
-			virtual Expression *mutate( ApplicationExpr *appExpr );
-			virtual Expression *mutate( AddressExpr *addrExpr );
-			virtual Expression *mutate( UntypedExpr *expr );
-			virtual DeclarationWithType* mutate( FunctionDecl *functionDecl );
-			virtual TypeDecl *mutate( TypeDecl *typeDecl );
-			virtual Expression *mutate( CommaExpr *commaExpr );
-			virtual Expression *mutate( ConditionalExpr *condExpr );
-			virtual Statement * mutate( ReturnStmt *returnStmt );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type * mutate( FunctionType *functionType );
-
-			virtual void doBeginScope();
-			virtual void doEndScope();
+
+			using PolyMutator::mutate;
+			virtual Expression *mutate( ApplicationExpr *appExpr ) override;
+			virtual Expression *mutate( AddressExpr *addrExpr ) override;
+			virtual Expression *mutate( UntypedExpr *expr ) override;
+			virtual DeclarationWithType* mutate( FunctionDecl *functionDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *typeDecl ) override;
+			virtual Expression *mutate( CommaExpr *commaExpr ) override;
+			virtual Expression *mutate( ConditionalExpr *condExpr ) override;
+			virtual Statement * mutate( ReturnStmt *returnStmt ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type * mutate( FunctionType *functionType ) override;
+
+			virtual void doBeginScope() override;
+			virtual void doEndScope() override;
 		  private:
 			/// Pass the extra type parameters from polymorphic generic arguments or return types into a function application
@@ -135,14 +138,16 @@
 		/// * Moves polymorphic returns in function types to pointer-type parameters
 		/// * adds type size and assertion parameters to parameter lists
-		class Pass2 : public PolyMutator {
+		class Pass2 final : public PolyMutator {
 		  public:
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual ObjectDecl *mutate( ObjectDecl *objectDecl );
-			virtual TypeDecl *mutate( TypeDecl *typeDecl );
-			virtual TypedefDecl *mutate( TypedefDecl *typedefDecl );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type *mutate( FunctionType *funcType );
+
+			using PolyMutator::mutate;
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *typeDecl ) override;
+			virtual TypedefDecl *mutate( TypedefDecl *typedefDecl ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type *mutate( FunctionType *funcType ) override;
 
 		  private:
@@ -156,5 +161,5 @@
 		/// * Calculates polymorphic offsetof expressions from offset array
 		/// * Inserts dynamic calculation of polymorphic type layouts where needed
-		class PolyGenericCalculator : public PolyMutator {
+		class PolyGenericCalculator final : public PolyMutator {
 		public:
 			typedef PolyMutator Parent;
@@ -163,19 +168,19 @@
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual ObjectDecl *mutate( ObjectDecl *objectDecl );
-			virtual TypedefDecl *mutate( TypedefDecl *objectDecl );
-			virtual TypeDecl *mutate( TypeDecl *objectDecl );
-			virtual Statement *mutate( DeclStmt *declStmt );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type *mutate( FunctionType *funcType );
-			virtual Expression *mutate( MemberExpr *memberExpr );
-			virtual Expression *mutate( SizeofExpr *sizeofExpr );
-			virtual Expression *mutate( AlignofExpr *alignofExpr );
-			virtual Expression *mutate( OffsetofExpr *offsetofExpr );
-			virtual Expression *mutate( OffsetPackExpr *offsetPackExpr );
-
-			virtual void doBeginScope();
-			virtual void doEndScope();
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
+			virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *objectDecl ) override;
+			virtual Statement *mutate( DeclStmt *declStmt ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type *mutate( FunctionType *funcType ) override;
+			virtual Expression *mutate( MemberExpr *memberExpr ) override;
+			virtual Expression *mutate( SizeofExpr *sizeofExpr ) override;
+			virtual Expression *mutate( AlignofExpr *alignofExpr ) override;
+			virtual Expression *mutate( OffsetofExpr *offsetofExpr ) override;
+			virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ) override;
+
+			virtual void doBeginScope() override;
+			virtual void doEndScope() override;
 
 		private:
@@ -197,14 +202,16 @@
 
 		/// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable
-		class Pass3 : public PolyMutator {
+		class Pass3 final : public PolyMutator {
 		  public:
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual ObjectDecl *mutate( ObjectDecl *objectDecl );
-			virtual TypedefDecl *mutate( TypedefDecl *objectDecl );
-			virtual TypeDecl *mutate( TypeDecl *objectDecl );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type *mutate( FunctionType *funcType );
+
+			using PolyMutator::mutate;
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
+			virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *objectDecl ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type *mutate( FunctionType *funcType ) override;
 		  private:
 		};
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 5fda7143cbcbc2c8f66e8862aecc99dfa3619c54)
+++ src/GenPoly/InstantiateGeneric.cc	(revision d0aa06e69e939030ae5bf7b928ed04f3806ff253)
@@ -147,5 +147,5 @@
 
 	/// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
-	class GenericInstantiator : public DeclMutator {
+	class GenericInstantiator final : public DeclMutator {
 		/// Map of (generic type, parameter list) pairs to concrete type instantiations
 		InstantiationMap< AggregateDecl, AggregateDecl > instantiations;
@@ -158,9 +158,10 @@
 		GenericInstantiator() : DeclMutator(), instantiations(), dtypeStatics(), typeNamer("_conc_") {}
 
-		virtual Type* mutate( StructInstType *inst );
-		virtual Type* mutate( UnionInstType *inst );
-
-		virtual void doBeginScope();
-		virtual void doEndScope();
+		using DeclMutator::mutate;
+		virtual Type* mutate( StructInstType *inst ) override;
+		virtual Type* mutate( UnionInstType *inst ) override;
+
+		virtual void doBeginScope() override;
+		virtual void doEndScope() override;
 	private:
 		/// Wrap instantiation lookup for structs
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 5fda7143cbcbc2c8f66e8862aecc99dfa3619c54)
+++ src/GenPoly/Specialize.cc	(revision d0aa06e69e939030ae5bf7b928ed04f3806ff253)
@@ -36,11 +36,12 @@
 	const std::list<Label> noLabels;
 
-	class Specialize : public PolyMutator {
+	class Specialize final : public PolyMutator {
 	  public:
 		Specialize( std::string paramPrefix = "_p" );
 
-		virtual Expression * mutate( ApplicationExpr *applicationExpr );
-		virtual Expression * mutate( AddressExpr *castExpr );
-		virtual Expression * mutate( CastExpr *castExpr );
+		using PolyMutator::mutate;
+		virtual Expression * mutate( ApplicationExpr *applicationExpr ) override;
+		virtual Expression * mutate( AddressExpr *castExpr ) override;
+		virtual Expression * mutate( CastExpr *castExpr ) override;
 		// virtual Expression * mutate( LogicalExpr *logicalExpr );
 		// virtual Expression * mutate( ConditionalExpr *conditionalExpr );
