0

次のような階層があります。

class Base
{
public:
    void Execute();
    virtual void DoSomething() = 0;
private:
    virtual void exec_();
};

class Derived : public Base
{
public:
   //DoSomething is implementation specific for classes Derived from Base
   void DoSomething();

private:
    void exec_();
};

void Base::Execute()
{
    // do some work 
    exec_();  //work specific for derived impl
    // do some other work
}

void Derived::DoSomething()
{
   //impl dependent so it can only be virtual in Base
}


int main()
{
  Derived d;
  Base& b = d;

  b.Execute();  //linker error cause Derived has no Execute() function??

}

したがって、問題は、Baseクラスを使用して派生を作成するときに、このパターンを使用してExecute()を呼び出す方法です。私の場合、Baseから派生した複数のクラスがあり、条件によっては別の派生クラスを選択する必要があるため、Derivedを直接作成したくありません。

誰か助けてもらえますか?

4

3 に答える 3

6

これ

class Base
{
public:
    void Execute();
private:
    virtual void exec_() {}
};

class Derived : public Base
{
private:
    void exec_() {}
};

void Base::Execute()
{
    // do some work 
    exec_();  //work specific for derived impl
    // do some other work
}

int main()
{
    Derived d;
    Base& b = d;

    b.Execute();
}

私のためにコンパイル、リンク、実行します。

于 2011-04-18T09:07:15.833 に答える
0

おそらく、基本クラスでexec_()を純粋な仮想にする必要があります。次に、派生クラスに実装する必要もあります。

于 2011-04-18T09:27:34.187 に答える
0

exec_()関数の関数定義を作成する必要があります。

于 2011-04-18T09:41:11.723 に答える