7

したがって、大雑把な検索に基づいて、コンストラクターから仮想関数 (純粋であろうとなかろうと) を呼び出すことはできないことを既に知っています。コードを再構築して、そうしないようにしました。これにより、私のクラスのユーザーはコードに関数呼び出しを追加することになりますが、これは実際にはそれほど大きな問題ではありません。つまり、ループ内でコンストラクターを呼び出す代わりに、問題のオブジェクトを毎回構築および破棄するハウスキーピングがないため、(実際に!) コードのパフォーマンスを向上させる関数を呼び出すようになりました。

でも、面白いものを見つけてしまった…

抽象クラスには、次のようなものがあります。

// in AbstractClass.h:
class AbstractClass {
 public:
  AbstractClass() {}
  virtual int Func(); //user can override
 protected:
  // Func broken up, derived class must define these
  virtual int Step1() = 0;
  virtual int Step2() = 0;
  virtual int Step3() = 0;
// in AbstractClass.cpp:
int AbstractClass::Func() {
  Step1();
  // Error checking goes here
  Step2();
  // More error checking...
  // etc...
}

基本的に、ほとんどの場合、純粋仮想関数が従う共通の構造がありますが、そうでない場合、 Func() は仮想であり、派生クラスが順序を指定できるようにします。ただし、各ステップは派生クラスで実装する必要があります。

Func() 関数は純粋な仮想関数を呼び出すため、ここで必ずしも間違っていることは何もないことを確認したかっただけです。つまり、基本クラスを使用して、StepX() を呼び出すと、悪いことが起こります。ただし、このクラスは、派生オブジェクトを作成し、その派生オブジェクトで Func() (例: MyDerivedObject.Func();) を呼び出すことによって利用されます。これには、すべての純粋仮想関数が適切にオーバーロードされている必要があります。

この方法に従って、私が見逃していることや間違っていることはありますか? 助けてくれてありがとう!

4

3 に答える 3

5

Func は、純粋な仮想のものではなく、仮想のものを呼び出しています。スコープ演算子、つまり AbstractClass::Step1() で呼び出しを修飾して、THAT (virtual pure) 関数を呼び出す必要があります。そうではないので、常に派生クラスによる実装を取得します。

于 2013-07-02T01:41:46.307 に答える
1

基本クラスの仮想関数は、派生クラスがそれをオーバーライドできるようにします。しかし、物事はそこで止まるようです。

ただし、基本クラスの仮想関数が純粋な場合、派生クラスは関数を実装する必要があります。

于 2013-12-11T00:43:58.250 に答える