簡単な答え:いいえ。クラスは、継承された仮想関数を 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