• C++PrimerPlus(第6版)中文版:Chapter13.3多态共有继承例子(重点讲虚函数):usebrass2.cpp


    上一个例子usebrass1.cpp中,方法是通过对象(而不是指针或者引用)来调用的,这个很清楚,也没有使用上虚函数的特性。本例子可以说明虚函数的使用场景和特点。

    数组中所有元素的类型必须相同,而Brass 和BrassPlus是不同的类型。但是可以创建指向Brass的指针数组,这样每个元素的种类都相同,由于使用的是公有继承,指向Brass的指针也可以指向BrassPlus对象。

    本例子的brass.h和brass.cpp 和usebrass1.cpp是一样的,这里就略过了。

    usebrass2.cpp

    1. // Chapter13.3usebrass2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include
    4. #include "brass.h"
    5. const int CLIENTS = 4;
    6. int main()
    7. {
    8. // std::cout << "Hello World!\n";
    9. using std::cin;
    10. using std::cout;
    11. using std::endl;
    12. Brass* p_clents[CLIENTS];
    13. std::string temp;
    14. long tempnum;
    15. double tempbal;
    16. char kind;
    17. for (int i = 0; i < CLIENTS; i++)
    18. {
    19. cout << "Enter client's name: ";
    20. getline(cin, temp);
    21. cout << "Enter client's account number: ";
    22. cin >> tempnum;
    23. cout << "Enter opening balance : $";
    24. cin >> tempbal;
    25. cout << "Enter 1 for Brass Account or" << "2 for BrassPlus Account: ";
    26. while (cin >> kind && (kind != '1' && kind != '2'))
    27. cout << "Enter either 1 or 2: ";
    28. if (kind == '1')
    29. p_clents[i] = new Brass(temp, tempnum, tempbal);
    30. else
    31. {
    32. double tmax, trate;
    33. cout << "Enter the overdraft limit: $";
    34. cin >> tmax;
    35. cout << "Enter the interest rate " << "as a decimal fraction:";
    36. cin >> trate;
    37. p_clents[i] = new BrassPlus(temp, tempnum, tempbal, tmax, trate);
    38. }
    39. while (cin.get() != '\n')
    40. continue;
    41. }
    42. cout << endl;
    43. for (int i = 0; i < CLIENTS; i++)
    44. {
    45. p_clents[i]->ViewAcct();
    46. cout << endl;
    47. }
    48. for (int i = 0; i < CLIENTS; i++)
    49. {
    50. delete p_clents[i];//free memory
    51. }
    52. cout << "Done.\n";
    53. return 0;
    54. }

    运行的时候需要一些交互式的输入,书上是这样输入的:

    Harry Fishsong

    112233

    1500 

    1

     Dinah Otternoe

    121213

    1800

    2

    350

    0.12

    Brenda Birdherd

    212118

    5200

    2

    800

    0.1

    Tim Turtletop

    233255

    688

    1

    即如果输入是2,代表是输入的是plus 用户,还需要提供透支金额,利率。

    如果数组成员指向的是Brass对象,则调用Brass::ViewAcct(),如果指向的是BrassPlus对象,则调用BrassPlus::ViewAcct()。如果Brass::ViewAcct()没有被声明为虚的,那么在任何情况下都将调用Brass::ViewAcct()。

    这个涉及到虚函数表,动态联编。下一节讨论这个主题。

  • 相关阅读:
    Python异常「1」(异常的概念、异常捕获、异常的传递、自定义异常)
    从0开发一个Chrome插件:用户反馈与更新 Chrome 插件
    rabbitMQ集群搭建
    苹果图片heic格式怎么转化成jpg?两种方法解决它
    国产华为设备:NAT地址转换实验
    【Visual Leak Detector】库的 22 个 API 使用说明
    “蔚来杯“2022牛客暑期多校训练营(补题合集)
    逆矩阵的性质
    全方位适配信创生态体系 远眺捷码完成国产化认证
    网易智企逆势进场,游戏工业化有了新可能
  • 原文地址:https://blog.csdn.net/superfreak/article/details/126481463