• 学习函数的重载与覆盖


    虚函数:

    • 覆盖的条件:同名 && 同参 && 同返回值 && 同const类型
    • 重载的条件:同名 && (不同参 || 不同const类型)
    • 非法的条件:同名 && 同参 && 不同返回值类型

    非虚函数:

    • 覆盖的条件:同名
    • 重载的条件:不能重载基类的函数,一旦同名,就会覆盖基类的函数,但是可以平级重载

    注意:覆盖只能发生在继承过程中,不是继承不能覆盖,出现非法重定义的错误。

    代码:

     1 #include <stdlib.h>
     2 
     3 /***
     4 * @author:zanzan101
     5 */
     6 
     7 class A
     8 {
     9 public:
    10     // 虚函数
    11     virtual void foo1()    {printf("A:foo1
    ");}
    12     virtual void foo2()    {printf("A:foo2
    ");}
    13     virtual void foo3()    {printf("A:foo3
    ");}
    14     virtual void foo4()    {printf("A:foo4
    ");}
    15 
    16     // 非虚函数
    17     void fun1(){printf("A:fun1
    ");}
    18     void fun2(){printf("A:fun2
    ");}
    19     void fun3(){printf("A:fun3
    ");}
    20     void fun4(){printf("A:fun4
    ");}
    21     void fun5(){printf("A:fun5
    ");}
    22 };
    23 class B : public A
    24 {
    25 public:
    26     // 虚函数
    27     void foo1(){printf("B:foo1
    ");}
    28     void foo2(int){printf("B:foo2
    ");}
    29     // int foo3(){printf("B:foo3
    "); return 0;} 非法!error C2555: “B::foo3”: 重写虚函数返回类型有差异,且不是来自“A::foo3”的协变
    30     void foo4() const {printf("B:foo4
    ");}
    31 
    32     // 非虚函数
    33     void fun1(){printf("B:fun1
    ");}
    34     void fun2(int){printf("B:fun2
    ");}
    35     int fun3(){printf("B:fun3
    ");return 0;}
    36     void fun4() const {printf("B:fun4
    ");}
    37 
    38     void func(){printf("B:func()
    ");}
    39 //    void func(){}    // 不能覆盖,非法重定义!
    40     void func(int){printf("B:func(int)
    ");}
    41     void func(double){printf("B:func(double)
    ");}
    42     void func() const{printf("B:func() const
    ");}
    43 };
    44 
    45 
    46 int _tmain(int argc, _TCHAR* argv[])
    47 {
    48     A* p = new B();
    49     
    50     printf(">> 同名同参同返回值:
    ");
    51     p->foo1();
    52     
    53     printf(">> 同名不同参同返回值:
    ");
    54     p->foo2();
    55     // p->foo2(1); 非法!
    56 
    57     // printf(">> 同名同参不同返回值:
    ");
    58     // p->foo3(); 非法!
    59     
    60     printf(">> 同名同参同返回值,加const:
    ");
    61     p->foo4();
    62 
    63     B* q = new B();
    64     printf(">> 同名同参同返回值:
    ");
    65     q->fun1();
    66 
    67     printf(">> 同名不同参同返回值:
    ");
    68     // q->fun2(); 非法!
    69     q->fun2(1);
    70 
    71     printf(">> 同名同参不同返回值:
    ");
    72     q->fun3();
    73 
    74     printf(">> 同名同参同返回值,加const:
    ");
    75     q->fun4();
    76 
    77     printf(">> 不同名:
    ");
    78     q->fun5();
    79 
    80     printf(">> 同域的重载:
    ");
    81     q->func();                // 参数重载
    82     q->func(1);                // 参数重载
    83     q->func(1.0);            // 参数重载
    84     ((const B*)q)->func();    // const重载
    85 //    ((const B*)q)->func(1);    // 非法!
    86 
    87     system("pause");
    88     return 0;
    89 }

    输出结果:

    >> 同名同参同返回值:
    B:foo1
    >> 同名不同参同返回值:
    A:foo2
    >> 同名同参同返回值,加const:
    A:foo4
    >> 同名同参同返回值:
    B:fun1
    >> 同名不同参同返回值:
    B:fun2
    >> 同名同参不同返回值:
    B:fun3
    >> 同名同参同返回值,加const:
    B:fun4
    >> 不同名:
    A:fun5
    >> 同域的重载:
    B:func()
    B:func(int)
    B:func(double)
    B:func() const
    请按任意键继续. . .
  • 相关阅读:
    grep
    virtualbox共享文件夹无法创建软链接的解决方法
    openH264的双向链表实现
    openH264构建过程
    Ninja构建系统入门
    ubuntu上安装meson & 如何使用meson编译C代码
    ln: failed to create symbolic link ‘libopenh264.so.6’: Operation not permitted
    RAII-资源获取即初始化
    可变参数实现原理-参数栈
    一个统计多文件单行字符串出现次数QT实现
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3405000.html
Copyright © 2020-2023  润新知