• C++零碎记录(十)


    17. 继承对象内存

    17.1 查询继承对象所占内存

    1. #include <iostream>
    2. using namespace std;
    3. #include<string>
    4. //继承中的对象模型
    5. class Base
    6. {
    7. public:
    8. int m_A;
    9. protected:
    10. int m_B;
    11. private:
    12. int m_C;
    13. };
    14. //公共继承
    15. class Son:public Base
    16. {
    17. int m_D;
    18. };
    19. //利用开发人员命令提示工具查看对象模型
    20. //跳转盘符→F:
    21. //跳转文件路径→cd 具体路径下
    22. //查看命令
    23. //cl /d1 reportSingleClassLayout查看的类名 "文件名"
    24. void test01()
    25. {
    26. //父类中所有非静态成员属性都会被子类继承下去
    27. //父类中私有成员属性 是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
    28. cout << "size of Son =" << sizeof(Son) << endl; //16个字节,父类3个int一个12个字节,字节1个int4个字节
    29. }
    30. int main()
    31. {
    32. test01();
    33. system("pause");
    34. return 0;
    35. }

    运行结果:

    • size of Son =16
    • 请按任意键继续. . .

    17.2 VS自带开发工具查询

    ① 首先打开visio studio的开发人员命令工具,如下图所示。

    ② 查询visio studio的项目所在地址。

    ③ "输入跳转盘符,例如,C:"->"输入项目所在地的地址"->"输入dir(查询项目中文件信息)"

    ④ 输入:cl(空格)/d1 reportSingleClassLayout查看的类名 "文件名",可以查看类所占内存空间大小。

    18. 继承构造和析构顺序

    ① 继承中,先调用父类构造函数,再调用子类构造函数,析构顺序与构造顺序相反,先调用子类析构函数,再调用父类析构函数。

    1. #include <iostream>
    2. using namespace std;
    3. #include<string>
    4. //继承中的构造和析构顺序
    5. class Base
    6. {
    7. public:
    8. Base()
    9. {
    10. cout << "Base构造函数!" << endl;
    11. }
    12. ~Base()
    13. {
    14. cout << "Base析构函数!" << endl;
    15. }
    16. };
    17. //
    18. class Son:public Base
    19. {
    20. public:
    21. Son()
    22. {
    23. cout << "Son构造函数!" << endl;
    24. }
    25. ~Son()
    26. {
    27. cout << "Son析构函数!" << endl;
    28. }
    29. };
    30. void test01()
    31. {
    32. //Base b; //创建父类对象只有父类的构造函数、析构函数
    33. //继承中的构造和析构顺序如下:
    34. //先构造父类、再构造子类,析构的顺序与构造的顺序相反
    35. Son s;
    36. }
    37. int main()
    38. {
    39. test01();
    40. system("pause");
    41. return 0;
    42. }

    运行结果:

    • Base构造函数!
    • Son构造函数!
    • Son析构函数!
    • Base析构函数!
    • 请按任意键继续. . .

    19. 同名成员处理

    ① 子类对象可以直接访问到子类中同名成员。

    ② 子类对象加作用域可以访问到父类同名成员。

    ③ 当子类与父类拥有同名的成员函数,子类会隐藏父类中所有同名成员函数(有参、无参),加作用域才可以访问到父类中同名函数。

    1. #include <iostream>
    2. using namespace std;
    3. #include<string>
    4. //继承中同名成员处理
    5. class Base
    6. {
    7. public:
    8. Base()
    9. {
    10. m_A = 100;
    11. }
    12. int m_A;
    13. void func()
    14. {
    15. cout << "Base - func()调用" << endl;
    16. }
    17. void func(int a)
    18. {
    19. cout << "Base - func(int a)调用" << endl;
    20. }
    21. };
    22. class Son:public Base
    23. {
    24. public:
    25. Son()
    26. {
    27. m_A = 200;
    28. }
    29. void func()
    30. {
    31. cout << "Son - func()调用" << endl;
    32. }
    33. int m_A;
    34. };
    35. //同名成员属性处理方式
    36. void test01()
    37. {
    38. Son s;
    39. cout << "Son 下 m_A=" << s.m_A << endl;
    40. //如果通过子类对象访问到父类中同名成员,需要加作用域
    41. cout << "Base 下 m_A=" << s.Base::m_A << endl;
    42. }
    43. //同名成员函数处理方式
    44. void test02()
    45. {
    46. Son s;
    47. s.func(); //直接调用 调用时子类中的同名成员
    48. //调用父类中同名成员函数
    49. s.Base::func();
    50. //如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
    51. //如果想访问到父类中被隐藏的同名成员函数,需要加作用域
    52. s.Base::func(100);
    53. }
    54. //同名成员函数处理
    55. int main()
    56. {
    57. test01();
    58. test02();
    59. system("pause");
    60. return 0;
    61. }

    运行结果:

    • Son 下 m_A=200
    • Base 下 m_A=100
    • Son - func()调用
    • Base - func()调用
    • Base - func(int a)调用
    • 请按任意键继续. . .

    链接:https://www.zhihu.com/question/437657370/answer/1692846096
     

  • 相关阅读:
    软件产品测试怎么做
    数据结构【二叉搜索树、leetcode刷题】
    AIGC 设计能替代真正的设计师设计吗?
    在 VSCode 中编写 Markdown 的进阶指南
    〔023〕Stable Diffusion 之 界面主题 篇
    银河麒麟安装arm架构mysql8
    删除C:\Users\Administrator\AppData\Local\Microsoft\WindowsA\python.exe
    华为认证 | CCIE和HCIE考哪个更吃香?
    JavaScript大作业:基于HTML实现紫色化妆品包装设计公司企业网站
    vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
  • 原文地址:https://blog.csdn.net/qq18218628646/article/details/132799766