C++ 重载 重写(覆盖)重定义

重载

  • overload是重载,一般是在同一个类中实现若干重载的方法,这些方法的名称相同而参数形式不同。但是不能靠返回类型来判断。
  • 位于同一个类中
  • 函数的名字必须相同
  • 形参列表不同
  • 若一个重载版本的函数面前有virtual修饰,则表示他是虚函数,但他也是属于重载的一个版本
  • 不同的构造函数(无参构造、有参构造、拷贝构造)是重载的应用
  • 重载运算符的本质也是函数的重载
  • 下面代码是函数的重载
#include <iostream>
using namespace std;

class PrData{
    public:
        void printdata(int i){
            cout<<"int"<<i<<endl;
        }
        void printdata(double i){
            cout<<"double"<<i<<endl;
        }
};
int main(){
    PrData pd;
    pd.printdata(1);
    pd.printdata(1.1);
}

重写(覆盖)

  • override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。
  • 被重写的函数不能是static的,必须是virtual的
  • 重写函数必须有相同的类型,名称和参数列表
  • 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public、protect也是可以的
#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);
 
   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();
 
   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}
  • 此时重写的函数可以通过父类指针访问。如果没有用virtual修饰函数,那么通过父类指针访问的仍然会是访问父类的函数。

重定义(隐藏)

  • 派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中函数名字一样。
  • 重定义也叫做隐藏,子类重定义父类中有相同名称的非虚函数(参数可以不同)。如果一个类,存在和父类相同的函数,那么这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用时不能成功的。
  • 不在同一个作用域(分别位于基类、派生类)
  • 函数的名字必须相同
  • 对函数的返回值、形参列表无要求
  • 若派生类定义该函数与基类的成员函数完全一样(返回值、形参列表均相同),且基类的该函数为virtual,则属于派生类重写基类的虚函数
  • 若重新定义了基类中的一个重载函数,则在派生类中,基类中该名字函数(即其他所有重载版本)都会被自动隐藏,包括同名的虚函数
  • 在上段代码中 不使用virtual函数修饰,那么即为重定义。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 5,902评论 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,146评论 1 51
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 8,025评论 1 5
  • 今天看到这段话,非常有感触,我决定放下一些执念,做一些对自己成长有益的事情。 “当我遇到问题的时候,或是当别人面临...
    刘莉莉_feb0阅读 1,716评论 0 0
  • 这次一定要辞职 时至今日,我在这家国企已经干了1年半。 刚毕业时,同学们都羡慕我一出校园就可以抱着铁饭碗。父母也...
    幺塘阅读 4,306评论 16 9