• C++_重载、重写和重定义的区别


    相信看到这个标题头就晕了,其实将他们彼此放到一起来看,就会比较清晰辨认了。

    重载:函数名相同,函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同。函数返回值的类型可以相同,也可以不相同。发生在一个类内部。

    重定义:也叫做隐藏,子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) ,指派生类的函数屏蔽了与其同名的基类函数。发生在继承中。

    重写:也叫做覆盖,一般发生在子类和父类继承关系之间。子类重新定义父类中有相同名称和参数的虚函数。


    如果一个类,存在和父类相同的函数,那么,这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用是不能成功的。 

    重写需要注意:
    1、 被重写的函数不能是static的。必须是virtual的
    2 、重写函数必须有相同的类型,名称和参数列表
    3 、重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的

    重定义规则如下:
       a 、如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
       b 、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏(如果相同有Virtual就是重写覆盖了)。

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 class Animal
     6 {
     7 public:
     8 void func1(int tmp)
     9 {
    10 cout<<"I'm an animal -"<<tmp<<endl;
    11 }
    12 void func1(char *s)//函数的重载
    13 {
    14 cout<<s<<endl;
    15 }
    16 virtual void func2(int tmp)
    17 {
    18 cout<<"I'm virtual animal -"<<tmp<<endl;
    19 }
    20 void func3(int tmp)
    21 {
    22 cout<<"I'm an animal -"<<tmp<<endl;
    23 }
    24 };
    25 
    26 class Fish:public Animal
    27 {
    28 public:
    29 void func1()//函数的重定义 会覆盖父类
    30 {
    31 cout<<"I'm a fish"<<endl;
    32 }
    33 void func2(char *s)//函数的重写
    34 {
    35 cout<<s<<endl;
    36 }
    37 };
    38 
    39 int main()
    40 {
    41 Fish fi;
    42 Animal an;
    43 
    44 fi.func1();
    45 fi.func2("I'm a fish,too");
    46 fi.func3(3);
    47 
    48 an.func1(1);
    49 an.func1("I'm an animal");
    50 an.func2(1);
    51 return 0;
    52 }

    运行结果如下:

  • 相关阅读:
    Struts2+Spring3+Mybatis3开发环境搭建
    spring+struts2+mybatis
    【LeetCode】Populating Next Right Pointers in Each Node
    【LeetCode】Remove Duplicates from Sorted Array
    【LeetCode】Remove Duplicates from Sorted Array II
    【LeetCode】Binary Tree Inorder Traversal
    【LeetCode】Merge Two Sorted Lists
    【LeetCode】Reverse Integer
    【LeetCode】Same Tree
    【LeetCode】Maximum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/yangxx-1990/p/10407486.html
Copyright © 2020-2023  润新知