首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中重新定义与覆盖

在C++中重新定义与覆盖
EN

Stack Overflow用户
提问于 2014-11-05 04:03:11
回答 1查看 30.7K关注 0票数 20

我对重定义和重写派生类中的函数之间的区别感到困惑。

我知道-在C++中,重新定义的函数是静态绑定的,被覆盖的函数是动态绑定的,虚函数是被覆盖的,非虚函数是重新定义的。

当一个派生类“重新定义”基类中的一个方法时,它被认为是重新定义的。但是当派生类是虚的时,它不再重新定义,而是重写。所以我理解规则的逻辑,但我不理解底线。

在下面的示例中,重新定义了函数SetScore。但是,如果我将基类中的setScore函数设为虚的(通过向其添加虚拟一词),派生类中的setScore将被覆盖。我不明白底线--有什么不同。在setScore?

基类:

代码语言:javascript
运行
复制
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; }
};

派生类:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
   // Define a CurvedActivity object.
   CurvedActivity exam;

   ... 

   // Send the values to the exam object.
   exam.setPercentage(percentage);
   exam.setScore(numericScore);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 04:07:52

这里有一些基本的区别:

重载函数是与一个或多个其他函数共享其名称的函数,但具有不同的参数列表。编译器根据使用的参数选择所需的函数。

覆盖的函数是子类中的方法,其定义与祖先类中的虚函数不同。编译器根据用于调用函数的对象的类型来选择所需的函数。

重新定义的函数是子类中的方法,它与祖先类中的非虚函数具有不同的定义。不要这样做。由于该方法不是虚拟的,因此编译器将根据对象引用的静态类型而不是对象的实际类型来选择要调用的函数。

  • Static类型检查意味着类型检查发生在编译时。在运行时不使用类型信息,因为在运行时使用类型信息时会发生case.
  • Dynamic类型检查。C++使用一种称为RTTI (运行时类型信息)的机制来实现这一点。使用RTTI的最常见示例是dynamic_cast运算符,它允许向下转换多态类型:
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26743991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档