【发布时间】:2014-12-31 20:46:02
【问题描述】:
我对派生类中重新定义和覆盖函数之间的区别感到困惑。
我知道 - 在 C++ 中,重新定义的函数是静态绑定的,重写的函数是动态绑定的,并且一个虚函数被重写,一个非虚函数被重新定义。
当派生类“重新定义”基类中的方法时,它被认为是重新定义。但是当派生类是虚拟的时,它不再重新定义而是覆盖。所以我了解规则的逻辑,但我不了解底线。
在下面的示例中,函数 SetScore 被重新定义。但是,如果我将基类中的 setScore 函数设为虚拟(通过向其添加单词 virtual),派生类中的 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);
【问题讨论】:
-
重写有助于类多态性。重载有利于功能多态性。重新定义两者都没有,而且是一个错误。
标签: c++ class inheritance base derived