-1

派生クラスに、基本クラスと同じ仮想関数の 2 つのセットを持たせることは可能ですか? 私は次のようなことをしようとしています。関数ポインターの 2 つのセットから選択できるというアイデア。

class Base
{
    virtual void func1;
    virtual void func2;
};

class Derived: Base
{
    float somemember;

    void somefunction()
    {
        Base* func = this->derived_functions1;
    }
    class derived_functions1
    {
        virtual void func1()
        {
           return somemember*100;
        }
        virtual void func2;
    };
    class derived_functions2
    {
        virtual void func1;
        virtual void func2;
    };
};
4

4 に答える 4

0

簡単な答え:いいえ。クラスは、継承された仮想関数を 1 回だけオーバーライドできます。

ただし、 Strategy Patternと呼ばれる、関数の動作をオンザフライで交換する設計パターンがあります。つまり、交換可能な動作を持つクラスには、その動作のインターフェイスを定義する Strategy 基本クラスへのポインターがあります。具体的な Strategy クラスが取り込まれます。動作が異なる関数は、その呼び出しを Strategy ポインターに委譲するだけです。あなたの質問に合わせた例を次に示します。

class Base {
public:
    virtual void func1() = 0;
    virtual void func2() = 0;

    virtual ~Base(){}
};

#include <iostream>
#include <memory>

class Derived : public Base
{
  struct F1Strategy { 
    virtual void f1Impl() = 0; 
    virtual ~F1Strategy() {}
  };

  struct Impl1 : F1Strategy {
    void f1Impl() override { std::cout << "one!\n"; }
  };

  struct Impl2 : F1Strategy {
    void f1Impl() override { std::cout << "two?\n"; }
  };    

  std::unique_ptr<F1Strategy> f1Strategy;
public:
  Derived() 
    : f1Strategy(new Impl1())
  {}

  void func1() override { f1Strategy->f1Impl(); }

  void func2() override { 
    static std::unique_ptr<F1Strategy> otherStrategy(new Impl2());
    f1Strategy.swap(otherStrategy);
  }
};

int main() {
  std::unique_ptr<Base> pb(new Derived());
  pb->func1();  //  ==> one!
  pb->func2();  //swap
  pb->func1();  //  ==> two?
  pb->func1();  //  ==> two?
  pb->func2();  //swap
  pb->func1();  //  ==> one!
}

実際に見てみましょう: http://ideone.com/zk3UTI

于 2013-05-16T07:22:21.967 に答える