我对重定义和重写派生类中的函数之间的区别感到困惑。
我知道-在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; }
};这是main:
// Define a CurvedActivity object.
CurvedActivity exam;
...
// Send the values to the exam object.
exam.setPercentage(percentage);
exam.setScore(numericScore);发布于 2014-11-05 04:07:52
这里有一些基本的区别:
重载函数是与一个或多个其他函数共享其名称的函数,但具有不同的参数列表。编译器根据使用的参数选择所需的函数。
覆盖的函数是子类中的方法,其定义与祖先类中的虚函数不同。编译器根据用于调用函数的对象的类型来选择所需的函数。
重新定义的函数是子类中的方法,它与祖先类中的非虚函数具有不同的定义。不要这样做。由于该方法不是虚拟的,因此编译器将根据对象引用的静态类型而不是对象的实际类型来选择要调用的函数。
https://stackoverflow.com/questions/26743991
复制相似问题