基本クラスB
に非仮想パブリック関数f()
があるとします。これは残念ながら派生クラスD
によってオーバーライドされています。基本クラスのポインターの下にある派生クラスオブジェクトが、基本クラスで定義されていて派生クラスでオーバーライドされた非仮想関数を呼び出すのを防ぐには?
D
オブジェクトd
がB
ポインタpB
に渡されています。
pB->f()
の呼び出しを防止する方法はありますか?
基本クラスB
に非仮想パブリック関数f()
があるとします。これは残念ながら派生クラスD
によってオーバーライドされています。基本クラスのポインターの下にある派生クラスオブジェクトが、基本クラスで定義されていて派生クラスでオーバーライドされた非仮想関数を呼び出すのを防ぐには?
D
オブジェクトd
がB
ポインタpB
に渡されています。
pB->f()
の呼び出しを防止する方法はありますか?
B
を変更できる場合は、f
を仮想にするか、仮想保護されたdo_f
に転送するか、その他のさまざまな処理を行うことができます。
B
を変更できない場合は、パブリックメソッドが呼び出されるのを止めることができず、非仮想基本クラスメソッドの呼び出しを何とかインターセプトできません。
2番目のフレーズ:構文は正しいですが、意味を解析することはほとんどありません。言い換えて気をつけてください。 –
完了、ありがとうございます。リファクタリング中に破損しました。 – Useless
あなたの質問は本質的に「どのように仮想機能を作成するのですか?」と尋ねます。それだけではできない理由はありませんが、B
の宣言を変更することはできません。
B
は、少なくとも1つの仮想機能を持っている場合は、*pB
が本当にD
あるかどうかを確認し、そうであればD&
にキャストするためにRTTIを使用することができます。 B*
をとる既存のコードを作成することはできません。あなたの娘クラスがあなたがB
と呼んだときに壊れた場合、それはそのインターフェースの契約を破ります。
それ以外の場合は、*pB
がB
インターフェースを呼び出すことによって何とかD
であることを決定することが可能かもしれないが、それはB
とD
にいくつかのrigmarole固有のだろう。
「人々がその機能を無効にしようとするのを防ぐ方法」という質問はありますか?その場合、 'D'の関数を' override'として宣言するとき、それは彼らの側で捕らえられるべきです。 – Quentin
仮想以外の機能を無効にすることはできません。 –
@KerrekSB - "非仮想関数を無効にすることはできません"。大虐殺の突然の攻撃、ええ?素敵な人になって、OPにあなたが意味することを説明してください。または、暗黙ではあるが、「あなたは時には隠れるかもしれないが、あなたは上書きできない」のように、あなたの否定の肯定的な代替案を提供する。 –