JSF.DERIVED.NON_VIRT.REDEFINED
継承された非仮想関数を派生クラスで再定義してはなりません。
理論的根拠
オブジェクトが「二面的な」動作を起こすのを防ぎます。
脆弱性とリスク
非仮想関数が静的にバインドされています。基本的に、非仮想関数は対応する基本クラスバージョンを非表示にします。このため、個々の派生クラスオブジェクトは、アクセスされた方法 (基本クラスのポインター/参照または派生クラスのポインター/参照のいずれかを介したアクセス) に応じて基本クラスオブジェクトまたは派生クラスオブジェクトのいずれかとして動作する可能性があります。
軽減と防止
動作におけるこの二重性を避けるには、非仮想関数の再定義を必ず避けてください。
例 1
1 class Base 2 { 3 public: 4 mf (void); 5 }; 6 7 class Derived : public Base 8 { 9 public: 10 mf (void); 11 }; 12 13 example_function(void) 14 { 15 Derived derived; 16 Base* base_ptr = &derived; // Points to derived 17 Derived* derived_ptr = &derived; // Points to derived 18 base_ptr->mf(); // Calls Base::mf() *** Different behavior for same object!! 19 derived_ptr->mf(); // Calls Derived::mf() 20 }