2016-09-11 17 views
0

基本クラスBに非仮想パブリック関数f()があるとします。これは残念ながら派生クラスDによってオーバーライドされています。基本クラスのポインターの下にある派生クラスオブジェクトが、基本クラスで定義されていて派生クラスでオーバーライドされた非仮想関数を呼び出すのを防ぐには?

DオブジェクトdBポインタpBに渡されています。

pB->f()の呼び出しを防止する方法はありますか?

+0

「人々がその機能を無効にしようとするのを防ぐ方法」という質問はありますか?その場合、 'D'の関数を' override'として宣言するとき、それは彼らの側で捕らえられるべきです。 – Quentin

+2

仮想以外の機能を無効にすることはできません。 –

+0

@KerrekSB - "非仮想関数を無効にすることはできません"。大虐殺の突然の攻撃、ええ?素敵な人になって、OPにあなたが意味することを説明してください。または、暗黙ではあるが、「あなたは時には隠れるかもしれないが、あなたは上書きできない」のように、あなたの否定の肯定的な代替案を提供する。 –

答えて

1

Bを変更できる場合は、fを仮想にするか、仮想保護されたdo_fに転送するか、その他のさまざまな処理を行うことができます。

Bを変更できない場合は、パブリックメソッドが呼び出されるのを止めることができず、非仮想基本クラスメソッドの呼び出しを何とかインターセプトできません。

+0

2番目のフレーズ:構文は正しいですが、意味を解析することはほとんどありません。言い換えて気をつけてください。 –

+0

完了、ありがとうございます。リファクタリング中に破損しました。 – Useless

0

あなたの質問は本質的に「どのように仮想機能を作成するのですか?」と尋ねます。それだけではできない理由はありませんが、Bの宣言を変更することはできません。

Bは、少なくとも1つの仮想機能を持っている場合は、*pBが本当にDあるかどうかを確認し、そうであればD&にキャストするためにRTTIを使用することができます。 B*をとる既存のコードを作成することはできません。あなたの娘クラスがあなたがBと呼んだときに壊れた場合、それはそのインターフェースの契約を破ります。

それ以外の場合は、*pBBインターフェースを呼び出すことによって何とかDであることを決定することが可能かもしれないが、それはBDにいくつかのrigmarole固有のだろう。

関連する問題