diff --git a/Core/Binning/ConstKBinAxis.h b/Core/Binning/ConstKBinAxis.h
index 33be5942421d3d56c45b20f0dd2d02acd29bbacb..d10c7c96b43723bf9d9a9b934d27acc5a256c951 100644
--- a/Core/Binning/ConstKBinAxis.h
+++ b/Core/Binning/ConstKBinAxis.h
@@ -30,17 +30,18 @@ public:
     //! @param start low edge of first bin
     //! @param end upper edge of last bin
     ConstKBinAxis(const std::string& name, size_t nbins, double start, double end);
-    virtual ~ConstKBinAxis() {}
+    ~ConstKBinAxis() final {}
 
-    ConstKBinAxis* clone() const;
+    ConstKBinAxis* clone() const final {
+        return new ConstKBinAxis(getName(), m_nbins, m_start, m_end); }
 
-    ConstKBinAxis* createClippedAxis(double left, double right) const;
+    ConstKBinAxis* createClippedAxis(double left, double right) const final;
 
 protected:
     ConstKBinAxis(const std::string& name, size_t nbins);
 
-    void print(std::ostream& ostr) const;
-    bool equals(const IAxis& other) const;
+    void print(std::ostream& ostr) const final;
+    bool equals(const IAxis& other) const final;
 
     double m_start;
     double m_end;
diff --git a/Core/Binning/VariableBinAxis.h b/Core/Binning/VariableBinAxis.h
index 18d1d02dda2ab9783840126760ef10200847fec4..61b5ef86676b0dc3bde22d0e85f7e800f8283d47 100644
--- a/Core/Binning/VariableBinAxis.h
+++ b/Core/Binning/VariableBinAxis.h
@@ -51,13 +51,13 @@ public:
     std::vector<double> getBinCenters() const;
     std::vector<double> getBinBoundaries() const { return m_bin_boundaries; }
 
-    VariableBinAxis* createClippedAxis(double left, double right) const;
+    virtual VariableBinAxis* createClippedAxis(double left, double right) const;
 
 protected:
     VariableBinAxis(const std::string& name, int nbins = 0);
     void setBinBoundaries(const std::vector<double> &bin_boundaries);
 
-    void print(std::ostream& ostr) const;
+    virtual void print(std::ostream& ostr) const;
     virtual bool equals(const IAxis& other) const;
     size_t m_nbins;
 
diff --git a/Core/Material/HomogeneousMagneticMaterial.h b/Core/Material/HomogeneousMagneticMaterial.h
index 9d69917b487fb74336761a721e6fa91acc8a4ffa..985781db3d8f8efd14cac447362c2a3bbd625c81 100644
--- a/Core/Material/HomogeneousMagneticMaterial.h
+++ b/Core/Material/HomogeneousMagneticMaterial.h
@@ -27,18 +27,16 @@ public:
 #ifndef SWIG
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 #endif
-    //! Constructs a material with _name_, _refractive_index_ and
-    //! _magnetic_field_
-    HomogeneousMagneticMaterial(const std::string &name, const complex_t refractive_index,
+    //! Constructs a material with _name_, _refractive_index_ and _magnetic_field_
+    HomogeneousMagneticMaterial(const std::string& name, const complex_t refractive_index,
                                 const kvector_t magnetic_field);
 
-    //! Constructs a material with _name_, refractive_index parameters and
-    //! _magnetic_field_
+    //! Constructs a material with _name_, refractive_index parameters and _magnetic_field_
     HomogeneousMagneticMaterial(const std::string &name, double refractive_index_delta,
                                 double refractive_index_beta, const kvector_t magnetic_field);
 
-    HomogeneousMagneticMaterial* clone() const final override;
-    HomogeneousMagneticMaterial* cloneInverted() const final override;
+    HomogeneousMagneticMaterial* clone() const final;
+    HomogeneousMagneticMaterial* cloneInverted() const final;
 
     //! Get the magnetic field (in Tesla)
     kvector_t getMagneticField() const { return m_magnetic_field; }
@@ -48,7 +46,7 @@ public:
 
     //! Indicates that the material is not scalar. This means that different
     //! polarization states will be diffracted differently
-    virtual bool isScalarMaterial() const { return false; }
+    bool isScalarMaterial() const final { return false; }
 
 #ifndef SWIG
     //! Get the scattering matrix (~potential V) from the material.
@@ -57,11 +55,10 @@ public:
 #endif
 
     //! Create a new material that is transformed with respect to this one
-    virtual const IMaterial* createTransformedMaterial(
-        const Transform3D& transform) const;
+    const IMaterial* createTransformedMaterial(const Transform3D& transform) const final;
 
 protected:
-    virtual void print(std::ostream &ostr) const {
+    void print(std::ostream &ostr) const final {
         ostr << "HomMagMat:" << getName() << "<" << this << ">{ "
              << "R=" << m_refractive_index << ", B=" << m_magnetic_field << "}";  }
 
diff --git a/Core/Particle/ParticleDistribution.h b/Core/Particle/ParticleDistribution.h
index 3316bd5e4347cea212a5b70426ef9ff430a76e80..1ab8e0c662b187d06ba8aea9932572fe646c07ee 100644
--- a/Core/Particle/ParticleDistribution.h
+++ b/Core/Particle/ParticleDistribution.h
@@ -29,19 +29,19 @@ class BA_CORE_API_ ParticleDistribution : public IAbstractParticle
 public:
     ParticleDistribution(const IParticle& prototype, const ParameterDistribution& par_distr);
 
-    virtual ParticleDistribution* clone() const;
-    virtual ParticleDistribution* cloneInvertB() const;
+    ParticleDistribution* clone() const final;
+    ParticleDistribution* cloneInvertB() const final;
 
-    void accept(ISampleVisitor* visitor) const override final { visitor->visit(this); }
+    void accept(ISampleVisitor* visitor) const final { visitor->visit(this); }
 
     //! Returns textual representation of *this and its descendants.
-    virtual std::string to_str(int indent=0) const;
+    std::string to_str(int indent=0) const final;
 
     //! Sets the refractive index of the ambient material.
-    virtual void setAmbientMaterial(const IMaterial& material);
+    void setAmbientMaterial(const IMaterial& material) final;
 
     //! Returns particle's material.
-    virtual const IMaterial* getAmbientMaterial() const;
+    const IMaterial* getAmbientMaterial() const final;
 
     //! Returns list of new particles generated according to a distribution.
     std::vector<const IParticle*> generateParticles() const;