美文网首页
C++ 重载 重写(覆盖)重定义

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

作者: hey白启明 | 来源:发表于2019-03-04 21:12 被阅读0次

    重载

    • 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函数修饰,那么即为重定义。

    参考资料

    相关文章

      网友评论

          本文标题:C++ 重载 重写(覆盖)重定义

          本文链接:https://www.haomeiwen.com/subject/phwyuqtx.html