Не виртуальный интерфейс - как вызвать правильную виртуальную функцию - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть иерархия, которая выглядит примерно так:

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??

}

Таким образом, вопрос заключается в том, как мне вызвать Execute (), используя этот шаблон, когда я создаю производную, используя мой базовый класс. В моем случае я не хочу создавать Derived напрямую, поскольку у меня есть несколько классов, производных от Base, и в зависимости от некоторых условий я должен выбрать другой производный класс.

Может кто-нибудь помочь?

Ответы [ 3 ]

6 голосов
/ 18 апреля 2011

Это

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();
}

компилирует, связывает и запускает для меня.

0 голосов
/ 18 апреля 2011

Вам нужно написать определение функции для функции exec_ ().

0 голосов
/ 18 апреля 2011

Вы, вероятно, также должны сделать exec_ () чисто виртуальным в вашем базовом классе.Затем вам также необходимо реализовать его в ваших производных классах.

...