From 8c573de6aceb119be979d17d2a507b63b069a4f1 Mon Sep 17 00:00:00 2001 From: vscoder-mas <73397578+vscoder-mas@users.noreply.github.com> Date: Sat, 4 May 2024 20:41:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Update=20=E3=80=90NO.102=E3=80=91=E8=85=BE?= =?UTF-8?q?=E8=AE=AF=E5=90=8C=E4=BA=8B=E5=86=85=E6=8E=A8=E7=9A=84=E9=82=A3?= =?UTF-8?q?=E4=BD=8DLinux=20CC++=E5=90=8E=E7=AB=AF=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E5=90=8C=E5=AD=A6=E9=9D=A2=E8=AF=95=E6=B2=A1=E8=BF=87.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 菱形继承解答 --- ...55\246\351\235\242\350\257\225\346\262\241\350\277\207.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" "b/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" index 974b486..d4b33f3 100644 --- "a/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" +++ "b/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" @@ -20,9 +20,9 @@ C++ 虚函数这是面试初、中级 C ++ 职位一个概率95%以上的面试 4. 什么是虚函数?虚函数的实现原理是什么? 5. 什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么? 6. 菱形继承(类D同时继承B和C,B和C又继承自A)体系下,虚表在各个类中的布局如何?如果类B和类C同时有一个成员变了m,m如何在D对象的内存地址上分布的?是否会相互覆盖? + 在菱形继承(也称为钻石继承)体系下,虚表的布局会更复杂一些。在这种情况下,为了避免基类A的成员在D中出现两次,我们通常会将基类A声明为虚基类。这样,无论A被继承多少次,它的数据成员在内存中只有一份拷贝。在这种情况下,类B和类C的虚表中都会包含指向类A的虚函数的指针,而类D的虚表则会包含指向类B、类C以及类A的虚函数的指针。关于成员变量m的问题,如果类B和类C都有一个名为m的成员变量,那么在类D中,这两个m会被视为两个完全不同的变量,它们在内存中的地址也会不同,不会相互覆盖。在类D中,你可以通过指定基类名来访问这两个m,例如D::B::m和D::C::m 另外,时至今日,你一定要熟悉 C++11/14/17 常用的语言特性和类库,这里简单地列一下: - - 统一的类成员初始化语法与 std::initializer_list - 注解标签(attributes) - final/override/=default/=delete 语法 @@ -218,4 +218,4 @@ Copy 原文链接:https://zhuanlan.zhihu.com/p/383586929 -作者:[Hu先生的Linux](https://www.zhihu.com/people/huhu520-10) \ No newline at end of file +作者:[Hu先生的Linux](https://www.zhihu.com/people/huhu520-10) From 8f7a07a282d9756cdeef0f6ad81df4dd9d3664ec Mon Sep 17 00:00:00 2001 From: vscoder-mas <73397578+vscoder-mas@users.noreply.github.com> Date: Sat, 4 May 2024 20:41:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Update=20=E3=80=90NO.102=E3=80=91=E8=85=BE?= =?UTF-8?q?=E8=AE=AF=E5=90=8C=E4=BA=8B=E5=86=85=E6=8E=A8=E7=9A=84=E9=82=A3?= =?UTF-8?q?=E4=BD=8DLinux=20CC++=E5=90=8E=E7=AB=AF=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E5=90=8C=E5=AD=A6=E9=9D=A2=E8=AF=95=E6=B2=A1=E8=BF=87.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 菱形继承解答1 --- ...\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" "b/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" index d4b33f3..da7b60c 100644 --- "a/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" +++ "b/\343\200\220NO.102\343\200\221\350\205\276\350\256\257\345\220\214\344\272\213\345\206\205\346\216\250\347\232\204\351\202\243\344\275\215Linux CC++\345\220\216\347\253\257\345\274\200\345\217\221\345\220\214\345\255\246\351\235\242\350\257\225\346\262\241\350\277\207.md" @@ -20,7 +20,7 @@ C++ 虚函数这是面试初、中级 C ++ 职位一个概率95%以上的面试 4. 什么是虚函数?虚函数的实现原理是什么? 5. 什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么? 6. 菱形继承(类D同时继承B和C,B和C又继承自A)体系下,虚表在各个类中的布局如何?如果类B和类C同时有一个成员变了m,m如何在D对象的内存地址上分布的?是否会相互覆盖? - 在菱形继承(也称为钻石继承)体系下,虚表的布局会更复杂一些。在这种情况下,为了避免基类A的成员在D中出现两次,我们通常会将基类A声明为虚基类。这样,无论A被继承多少次,它的数据成员在内存中只有一份拷贝。在这种情况下,类B和类C的虚表中都会包含指向类A的虚函数的指针,而类D的虚表则会包含指向类B、类C以及类A的虚函数的指针。关于成员变量m的问题,如果类B和类C都有一个名为m的成员变量,那么在类D中,这两个m会被视为两个完全不同的变量,它们在内存中的地址也会不同,不会相互覆盖。在类D中,你可以通过指定基类名来访问这两个m,例如D::B::m和D::C::m +在菱形继承(也称为钻石继承)体系下,虚表的布局会更复杂一些。在这种情况下,为了避免基类A的成员在D中出现两次,我们通常会将基类A声明为虚基类。这样,无论A被继承多少次,它的数据成员在内存中只有一份拷贝。在这种情况下,类B和类C的虚表中都会包含指向类A的虚函数的指针,而类D的虚表则会包含指向类B、类C以及类A的虚函数的指针。关于成员变量m的问题,如果类B和类C都有一个名为m的成员变量,那么在类D中,这两个m会被视为两个完全不同的变量,它们在内存中的地址也会不同,不会相互覆盖。在类D中,你可以通过指定基类名来访问这两个m,例如D::B::m和D::C::m 另外,时至今日,你一定要熟悉 C++11/14/17 常用的语言特性和类库,这里简单地列一下: - 统一的类成员初始化语法与 std::initializer_list