La redéfinition de vs de remplacement dans le C++

Je suis confus sur les différences entre les redéfinir et de fonctions de remplacement dans les classes dérivées.

Je sais qu'En C++, de redéfinir les fonctions sont statiquement lié et remplacé fonctions sont dynamiquement lié et qui a une fonction virtuelle est substituée, et non virtuelle la fonction est redéfini.

Lorsqu'une classe dérivée "redéfinit" une méthode dans une classe de base est considérée redéfinir. Mais quand une classe dérivée est virtuel, il n'est plus redéfinit mais plutôt des remplacements. Si je comprends bien, la logistique des règles, mais je ne comprends pas la ligne de fond.

Dans l'exemple ci-dessous, la fonction SetScore est redéfini. Cependant, si je fais le setScore fonction de la classe de base virtuelle (par l'ajout du mot virtuel) le setScore dans la classe dérivée sera remplacée. Je ne comprends pas la ligne de fond - quelle est la différence. dans setScore?

La classe de base:

class GradedActivity
{
protected:
   char letter;            //To hold the letter grade
   double score;           //To hold the numeric score
   void determineGrade();  //Determines the letter grade
public:
   //Default constructor
   GradedActivity()
  { letter = ' '; score = 0.0; }

 //Mutator function
   void setScore(double s) 
      { score = s;
        determineGrade();}

   //Accessor functions
   double getScore() const
      { return score; }

       char getLetterGrade() const
      { return letter; }
};

La classe dérivée:

class CurvedActivity : public GradedActivity
{
protected:
   double rawScore;     //Unadjusted score
   double percentage;   //Curve percentage
public:
   //Default constructor
   CurvedActivity() : GradedActivity()
      { rawScore = 0.0; percentage = 0.0; }

   //Mutator functions
   void setScore(double s) 
      { rawScore = s;
        GradedActivity::setScore(rawScore * percentage); }

   void setPercentage(double c)
      { percentage = c; }

   //Accessor funtions
   double getPercentage() const
      { return percentage; }

   double getRawScore() const
      { return rawScore; }
};

Voici les principaux:

   //Define a CurvedActivity object.
   CurvedActivity exam;

   ... 

   //Send the values to the exam object.
   exam.setPercentage(percentage);
   exam.setScore(numericScore);
Primordial facilite la classe de polymorphisme. La surcharge facilite polymorphisme fonctionnel. La redéfinition de ne et est une erreur.

OriginalL'auteur YelizavetaYR | 2014-11-04