Проблема наследования классов в Win32 / C ++ - PullRequest
0 голосов
/ 29 августа 2011

Я пишу систему эффектов GL в своем приложении, поэтому у меня есть суперкласс

cEffect - который обрабатывает загрузку / анализ файла конфигурации для каждого эффекта

идругие унаследованные классы

cFX <<em> name > - для каждого добавляемого мной эффекта (размытие, цветение, хаос, ...).

код здесь упрощен, но выглядит следующим образом:

Class cEffect
{
    public:
     bool ParseString(...);

    private:
     int m_nStartFrame;
     int m_nEndFrame;
     float m_fSpeed;
};


// Blur effect
Class cFXBlur : public cEffect
{
  public: 
   bool RenderFrame(...);
};
// Bloom effect
Class cFXBloom : public cEffect
{
  public: 
   bool RenderFrame(...);
};
// Scene drawing effect
Class cFXScene : public cEffect
{
  public: 
   bool RenderFrame(...);
};
// Clear the depth/color buffer
Class cFXClearBuffers : public cEffect
{
  public
   bool RenderFrame(...);
}

Теперь демонстрационный движок обрабатывает

std::vector<cEffect *> m_pvEffects;

Vector, к которому добавлен список эффектов.И когда к текущему времени добавляется эффект (скажем, я добавляю размытие), я добавляю его следующим образом:

// Blur to be added 

cEffect *newEffect = new cFXBlur;
newEffect->SetStartTime(x);
newEffect->SetEndTime(y);
newEffect->SetPower(13.0f);
newEffect->SetTexture(...);

// Now add the effect to the effects list.
m_pvEffects.push_back(newEffect);

Теперь, когда я рендеринг, я перебираю список m_pvEffects - но также я хотел бы вызватьметод RenderFrame (который доступен для каждого CFX <<em> name > эффекта).

(*it)->RenderFrame(...) 

Но компилятор говорит:

ошибка C2039: «RenderFrame»: не является членом «CEffect»

Я вроде понимаю, почему это происходит, но не могу придумать, как я могу это исправить, можете ли вы, ребята, помочь мнепожалуйста, похоже, что я потерял сюжет ...

Спасибо за любые предложения, что я могу сделать, чтобы добавить CFX к вектору cEffect и использовать его позже-> RenderFrame метод?

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Вы должны изменить свой класс cEffect на:

Class cEffect
{
    public:
     bool ParseString(...);
     virtual bool RenderFrame(...) = 0;

    private:
     int m_nStartFrame;
     int m_nEndFrame;
     float m_fSpeed;
};

Вам нужно ключевое слово virtual, если вы хотите переопределить метод в подклассе.= 0 делает класс cEffect абстрактным (то есть вы не можете создать объект непосредственно типа cEffect), поэтому подклассы должны реализовывать метод RenderFrame(...)

1 голос
/ 29 августа 2011

Ошибка возникает, потому что cEffect не имеет функции-члена с именем RenderFrame.То, что вы хотите, это виртуальная функция, фундаментальная концепция объектно-ориентированного программирования.В основном вам нужно добавить функцию

virtual bool RenderFrame(...);

в ваше определение cEffect.Ключевое слово virtual в основном говорит компилятору разрешить его во время выполнения.Это означает, что если вы вызываете этот метод для cEffect указателя или ссылки , вызывается соответствующий метод конкретного производного класса, к которому этот указатель или контрольная точка вызывается.В этом случае вам также следует объявить метод как виртуальный во всех производных классах (хотя это необязательно, это делает ваш код более понятным).

Если вы не хотите, чтобы метод базового класса делал что-либо, и вы хотитетребовать, чтобы все производные классы переопределяли его собственной реализацией, тогда вы можете сделать этот метод чисто виртуальным в базовом классе, расшифровав его как

virtual bool RenderFrame(...) = 0;

Это в основном говорит компилятору, что это абстрактныйметод, который не имеет конкретной реализации и реализуется только производными классами.

Это очень упрощенное объяснение (извинения каждому эксперту, который считает мои формулировки не на 100% точными).Вам следует прочитать еще немного материала по объектно-ориентированному программированию, особенно в сочетании с C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...