6

別のクラスからクラスを派生させて関数を上書きすると、派生クラスBase::myFunction()の実装内で呼び出して基本関数を呼び出すことができます。myFunc

Baseただし、上書きされた関数で明示的に呼び出されることなく、基本関数が呼び出されることをクラスで定義する方法はありますか? (派生関数の実行前または実行後)

または、さらに良いことに、仮想Baseクラスに仮想関数があり、2 つのプライベート関数before()とが実装されている場合、このクラスの派生クラスの関数が呼び出される前後にクラスで定義after()できますか? ?BaseBasebefore()after()

ありがとう!

4

3 に答える 3

21

いいえ、これは不可能です。
ただし、次のように別の仮想関数を呼び出すことでシミュレートできます。

class Base
{
public:
  void myFunc()
  {
    before();
    doMyFunc();
    after();
  }

  virtual void doMyFunc() = 0;
};
于 2009-12-15T19:59:25.847 に答える
0

派生クラスがベースのメソッドをオーバーロード/オーバーライドするのを防ごうとしています。メソッドを「オーバーライド不可」としてマークすることでそれを奨励できますが (言語によって異なります)、常に回避する方法があります。

つまり、特定の方法でクラスを使用するよう誰かに強制することはできません。使用方法を伝えるだけです。

于 2009-12-15T19:58:29.063 に答える
0

C++ について答えると、継承された関数を「目に見えない」方法で呼び出すことはできません。

継承されたクラスを介して呼び出される唯一のメソッドは、コンストラクターとデストラクターです。

于 2009-12-15T20:01:32.350 に答える