• 20180103牛客网刷题


    今天这题出现了很多看不懂的,慢慢看吧

    收了几个c++的题

    1.对下面的程序段


     

    编译运行后,程序输出结果是()

    • CB::f1() CC::f2()
    • CB::f1() CB::f2()
    • CB::f1() CA::f2()
    • CA::f1() CC::f2()

    上边代码大约是酱紫的:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 class CA {
     6 public:
     7     virtual void f1 () {
     8         cout << "CA::f1()" << endl;
     9         f2();
    10     }
    11     void f2 () {
    12         cout << "CA::f2()" << endl;
    13     }
    14 };
    15 class CB : public CA {
    16 public:
    17     void f1 () {
    18         cout << "CB::f1()" << endl;
    19         f2();
    20     }
    21     void f2 () {
    22         cout << "CB::f2()" << endl;
    23     }
    24 };
    25 class CC : public CB {
    26 public:
    27     virtual void f2 () {
    28         cout << "CC:f2()" << endl;
    29     }
    30 };
    31 int main (void) {
    32     CC c;
    33     CA *pa = &c;
    34     pa -> f1();
    35     return 0;
    36 }

    某大牛的解题:

    CA* pa = &c;这句话是父类指针指向子类对象,调用pa->f1()时,因为父类中的f1()是虚函数,所以将发生动态绑定,调用子类CB中的f1()函数,先输出CB::f1()
    在CB类的f1()函数中,调用非虚函数f2(),但因为其父类CA中的f2()函数并不是virtual函数,所以将调用CB类中的f2()函数,输出CB::f2()。如果将CA类中的f2()改成虚函数,那么将输出CC::f2();如果将CB类中的f2()改成虚函数,也将输出CC::f2(),这是满足动态绑定的。
     
    c++继承的坑还是挺大的,心累
  • 相关阅读:
    js引用类型赋值不改变原对象值
    VS2017启动实例调试(谷歌浏览器)闪退问题
    ext6时间控件(带时分秒)
    extjs列表中文件上传与下载(带有重命名操作)
    c# word(1) 向标签处添加文字
    关于页面加载后执行使用afterrender
    ExtJS,grid多选框列
    vue起手式
    Javascript诞生与历史
    markdown语法说明
  • 原文地址:https://www.cnblogs.com/ijrys/p/8185584.html
Copyright © 2020-2023  润新知