我對派生類中重新定義和重寫函數之間的區別感到困惑。在C++中重新定義與重寫
我知道 - 在C++中,重新定義的函數是靜態綁定的,重寫的函數是動態綁定的,並且重寫了虛擬函數,並重新定義了非虛函數。
當一個派生類「重新定義」了一個基類中的方法時,其被重新定義。但是當派生類是虛擬的時,它不再重新定義,而是重寫。所以我理解規則的後勤,但我不明白底線。
在下面的示例中,函數SetScore被重新定義。但是,如果我使基類虛擬的setScore函數(通過向其添加虛擬字),派生類中的setScore將被覆蓋。我不明白底線 - 有什麼區別。在setScore?
基類:
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; }
};
派生類:
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; }
};
這是主要:
// Define a CurvedActivity object.
CurvedActivity exam;
...
// Send the values to the exam object.
exam.setPercentage(percentage);
exam.setScore(numericScore);
覆蓋有助於類多態性。重載有利於函數多態性。重新定義既不會也是錯誤。 – orfdorf 2014-11-04 20:10:47