我对派生类中重新定义和覆盖函数之间的差异感到困惑.
我知道 – 在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);
解决方法
这里有一些基本的区别:
重载函数是一个与一个或多个其他函数共享其名称但具有不同参数列表的函数.编译器根据所使用的参数选择所需的功能.
重写函数是后代类中具有与祖先类中的虚函数不同的定义的方法.编译器根据用于调用该函数的对象的类型选择所需的函数.
重新定义的函数是后代类中具有与祖先类中的非虚函数不同的定义的方法.不要这样做由于该方法不是虚拟的,编译器将根据对象引用的静态类型而不是实际的对象类型选择要调用的函数.
>静态类型检查意味着在编译时会发生类型检查.在这种情况下,运行时没有使用类型信息.>在运行时使用类型信息时,会发生动态类型检查. C使用称为RTTI的机制(运行时类型信息)来实现.使用RTTI的最常见的例子是dynamic_cast运算符,它允许多种类型的转换: