C ++ vtablesред рднрд╛рдЧ 2 (рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ + рдХрдВрдкрд╛рдЗрд▓рд░-рдЬрдирд░реЗрдЯреЗрдб рдХреЛрдб)

рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдареНрдпрдХреНрд░рдо "C ++ рдбреЗрд╡рд▓рдкрд░" рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ? Google рдЯреЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд░реИрдХреНрдЯрд┐рд╕ рдХреНрд▓рд╛рд╕ рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рджреЗрдЦреЗрдВ!



рднрд╛рдЧ 3 - рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ рдмрд╛рдд рдХреА рдХрд┐ рдХреИрд╕реЗ vtables рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдореЗрдВред рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрднрд╛рд╕реА рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдореЗрдВ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


class ios ... class istream : virtual public ios ... class ostream : virtual public ios ... class iostream : public istream, public ostream 

рдпрджрд┐ рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП virtual рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдерд╛, рддреЛ iostream рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ios рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдВрдЧреЗ рдЬреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╕рд┐рд░рджрд░реНрдж рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЕрдкреНрд░рднрд╛рд╡реА рд╣реЛрдВрдЧреЗред


рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:


 #include <iostream> using namespace std; class Grandparent { public: virtual void grandparent_foo() {} int grandparent_data; }; class Parent1 : virtual public Grandparent { public: virtual void parent1_foo() {} int parent1_data; }; class Parent2 : virtual public Grandparent { public: virtual void parent2_foo() {} int parent2_data; }; class Child : public Parent1, public Parent2 { public: virtual void child_foo() {} int child_data; }; int main() { Child child; } 

рдЖрдЗрдП child рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рдореИрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдбрдВрдк рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдкрд░ vtable Child рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рдЬрдм рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИред


 (gdb) p child $1 = {<Parent1> = {<Grandparent> = {_vptr$Grandparent = 0x400998 <vtable for Child+96>, grandparent_data = 0}, _vptr$Parent1 = 0x400950 <vtable for Child+24>, parent1_data = 0}, <Parent2> = {_vptr$Parent2 = 0x400978 <vtable for Child+64>, parent2_data = 4195888}, child_data = 0} (gdb) x/600xb 0x400938 0x400938 <vtable for Child>: 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400940 <vtable for Child+8>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400948 <vtable for Child+16>: 0x00 0x0b 0x40 0x00 0x00 0x00 0x00 0x00 0x400950 <vtable for Child+24>: 0x70 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400958 <vtable for Child+32>: 0xa0 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400960 <vtable for Child+40>: 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400968 <vtable for Child+48>: 0xf0 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x400970 <vtable for Child+56>: 0x00 0x0b 0x40 0x00 0x00 0x00 0x00 0x00 0x400978 <vtable for Child+64>: 0x90 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400980 <vtable for Child+72>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400988 <vtable for Child+80>: 0xe0 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x400990 <vtable for Child+88>: 0x00 0x0b 0x40 0x00 0x00 0x00 0x00 0x00 0x400998 <vtable for Child+96>: 0x80 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x4009a0 <VTT for Child>: 0x50 0x09 0x40 0x00 0x00 0x00 0x00 0x00 0x4009a8 <VTT for Child+8>: 0xf8 0x09 0x40 0x00 0x00 0x00 0x00 0x00 0x4009b0 <VTT for Child+16>: 0x18 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x4009b8 <VTT for Child+24>: 0x98 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x4009c0 <VTT for Child+32>: 0xb8 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x4009c8 <VTT for Child+40>: 0x98 0x09 0x40 0x00 0x00 0x00 0x00 0x00 0x4009d0 <VTT for Child+48>: 0x78 0x09 0x40 0x00 0x00 0x00 0x00 0x00 0x4009d8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x4009e0 <construction vtable for Parent1-in-Child>: 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x4009e8 <construction vtable for Parent1-in-Child+8>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x4009f0 <construction vtable for Parent1-in-Child+16>: 0x50 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x4009f8 <construction vtable for Parent1-in-Child+24>: 0x70 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400a00 <construction vtable for Parent1-in-Child+32>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400a08 <construction vtable for Parent1-in-Child+40>: 0xe0 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x400a10 <construction vtable for Parent1-in-Child+48>: 0x50 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400a18 <construction vtable for Parent1-in-Child+56>: 0x80 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400a20 <typeinfo name for Parent1>: 0x37 0x50 0x61 0x72 0x65 0x6e 0x74 0x31 0x400a28 <typeinfo name for Parent1+8>: 0x00 0x31 0x31 0x47 0x72 0x61 0x6e 0x64 0x400a30 <typeinfo name for Grandparent+7>: 0x70 0x61 0x72 0x65 0x6e 0x74 0x00 0x00 0x400a38 <typeinfo for Grandparent>: 0x50 0x10 0x60 0x00 0x00 0x00 0x00 0x00 0x400a40 <typeinfo for Grandparent+8>: 0x29 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400a48: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400a50 <typeinfo for Parent1>: 0xa0 0x10 0x60 0x00 0x00 0x00 0x00 0x00 0x400a58 <typeinfo for Parent1+8>: 0x20 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400a60 <typeinfo for Parent1+16>: 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x400a68 <typeinfo for Parent1+24>: 0x38 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400a70 <typeinfo for Parent1+32>: 0x03 0xe8 0xff 0xff 0xff 0xff 0xff 0xff 0x400a78: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400a80 <construction vtable for Parent2-in-Child>: 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400a88 <construction vtable for Parent2-in-Child+8>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400a90 <construction vtable for Parent2-in-Child+16>: 0xd0 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400a98 <construction vtable for Parent2-in-Child+24>: 0x90 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400aa0 <construction vtable for Parent2-in-Child+32>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400aa8 <construction vtable for Parent2-in-Child+40>: 0xf0 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x400ab0 <construction vtable for Parent2-in-Child+48>: 0xd0 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400ab8 <construction vtable for Parent2-in-Child+56>: 0x80 0x08 0x40 0x00 0x00 0x00 0x00 0x00 0x400ac0 <typeinfo name for Parent2>: 0x37 0x50 0x61 0x72 0x65 0x6e 0x74 0x32 0x400ac8 <typeinfo name for Parent2+8>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400ad0 <typeinfo for Parent2>: 0xa0 0x10 0x60 0x00 0x00 0x00 0x00 0x00 0x400ad8 <typeinfo for Parent2+8>: 0xc0 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400ae0 <typeinfo for Parent2+16>: 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x400ae8 <typeinfo for Parent2+24>: 0x38 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400af0 <typeinfo for Parent2+32>: 0x03 0xe8 0xff 0xff 0xff 0xff 0xff 0xff 0x400af8 <typeinfo name for Child>: 0x35 0x43 0x68 0x69 0x6c 0x64 0x00 0x00 0x400b00 <typeinfo for Child>: 0xa0 0x10 0x60 0x00 0x00 0x00 0x00 0x00 0x400b08 <typeinfo for Child+8>: 0xf8 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400b10 <typeinfo for Child+16>: 0x02 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x400b18 <typeinfo for Child+24>: 0x50 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400b20 <typeinfo for Child+32>: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400b28 <typeinfo for Child+40>: 0xd0 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400b30 <typeinfo for Child+48>: 0x02 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x400b38 <vtable for Grandparent>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x400b40 <vtable for Grandparent+8>: 0x38 0x0a 0x40 0x00 0x00 0x00 0x00 0x00 0x400b48 <vtable for Grandparent+16>: 0x80 0x08 0x40 0x00 0x00 0x00 0x00 0x00 

рд╡рд╛рд╣, рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рджреЛ рдирдП рдкреНрд░рд╢реНрди рддреБрд░рдВрдд VTT : VTT рдХреНрдпрд╛ рд╣реИ рдФрд░ vtable for X-in-Child рдирд┐рд░реНрдорд╛рдг vtable for X-in-Child ? рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЬрд▓реНрдж рд╣реА рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред
рдмрдЪреНрдЪреЗ рд╕реНрдореГрддрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


рдЖрдХрд╛рд░рдореВрд▓реНрдп
8 рдмрд╛рдЗрдЯреНрд╕_vrr $ рдкреЗрд░реЗрдВрдЯ 1
4 рдмрд╛рдЗрдЯреНрд╕parent1_data (+ 4 рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕)
8 рдмрд╛рдЗрдЯреНрд╕_vptr $ рдкреЗрд░реЗрдВрдЯ 2
4 рдмрд╛рдЗрдЯреНрд╕parent2_data
4 рдмрд╛рдЗрдЯреНрд╕child_data
8 рдмрд╛рдЗрдЯреНрд╕_vptr $ рджрд╛рджрд╛-рджрд╛рджреА
4 рдмрд╛рдЗрдЯреНрд╕grandparent_data (+ 4 рдмрд╛рдЗрдЯреНрд╕ рднрд░реЗрдВ)

рджрд░рдЕрд╕рд▓, Child рдкрд╛рд╕ Child рдХрд╛ рдХреЗрд╡рд▓ 1 рдЙрджрд╛рд╣рд░рдг рд╣реИред рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╣ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕рд░реНрд╡реЛрдЪреНрдЪ рд╣реИред
рдпрд╣рд╛рдБ vtable рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


рдкрддрд╛рдореВрд▓реНрдпрд╕рд╛рдордЧреНрд░реА
0x4009380x20 (32)рд╡рд░реНрдЪреБрдЕрд▓-рдмреЗрд╕ рдСрдлрд╝рд╕реЗрдЯ (рд╣рдо рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ)
0x4009400top_offset
0x4009480x400b00рдмрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдирдлреЛ
0x4009500x400870Parent1 :: parent1_foo ()ред рд╡рд╛рдЗрдЯреЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░ рдкреЗрд░реЗрдВрдЯ 1 рдЕрдВрдХ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
0x4009580x4008a0рдмрдЪреНрдЪрд╛ :: child_foo ()
0x4009600x10 (16)рд╡рд░реНрдЪреБрдЕрд▓-рдмреЗрд╕ рдСрдлрд╝рд╕реЗрдЯ
0x400968-16top_offset
0x40090x400bрдмрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдирдлреЛ
7000
0x4009780x400890Parent2 :: parent2_foo ()ред Vtable рдкреЙрдЗрдВрдЯрд░ Parent2 рдпрд╣рд╛рдБ рдкреЙрдЗрдВрдЯ рдХрд░рддрд╛ рд╣реИред
0x4009800рд╡рд░реНрдЪреБрдЕрд▓-рдмреЗрд╕ рдСрдлрд╝рд╕реЗрдЯ
0x400988-32top_offset
0x4009900x400b00рдмрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдирдлреЛ
0x4009980x400880рджрд╛рджрд╛-рджрд╛рджреА :: grandparent_foo ()ред рд╡рд╛рдЗрдЯрдЯреЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░ рдЧреНрд░реИрдВрдбрдкреЗрдВрдЯреЗрдВрдЯ рдпрд╣рд╛рдБ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдКрдкрд░ рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ - virtual-base offset ред рдЬрд▓реНрдж рд╣реА рд╣рдо рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд╣ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рдЖрдЗрдП рдЗрди рдЕрдЬреАрдм рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ construction vtables ред рдпрд╣рд╛рдБ vtable for Parent1-in-Child рдирд┐рд░реНрдорд╛рдг vtable for Parent1-in-Child :


рдореВрд▓реНрдпрд╕рд╛рдордЧреНрд░реА
0x20 (32)рд╡рд░реНрдЪреБрдЕрд▓-рдмреЗрд╕ рдСрдлрд╝рд╕реЗрдЯ
0рд╢реАрд░реНрд╖ рдСрдлрд╕реЗрдЯ
0x400a50рдЯрд╛рдЗрдк 1 рдХреЗ рд▓рд┐рдП
0x400870Parent1 :: parent1_foo ()
0рд╡рд░реНрдЪреБрдЕрд▓-рдмреЗрд╕ рдСрдлрд╝рд╕реЗрдЯ
-32рд╢реАрд░реНрд╖ рдСрдлрд╕реЗрдЯ
0x400a50рдЯрд╛рдЗрдк 1 рдХреЗ рд▓рд┐рдП
0x400880рджрд╛рджрд╛ рджрд╛рджреА :: grandparent_foo ()

рдлрд┐рд▓рд╣рд╛рд▓, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред рддреЛ:


рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ Child ред рдЖрдкрдХреЛ рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдирдП рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЦреБрдж рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рдЖрдк рд╕реАрдзреЗ Grandparent рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ), рдЖрдк рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕реАрдзреЗ рдЗрд╕рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ (рдпрджрд┐ рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдирд╣реАрдВ рдереЗ, рддреЛ рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ Parent1 1 рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ Parent1 рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ Parent1 )ред рдЖрдкрдиреЗ this += 32 рдмрд╛рдЗрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ Grandparent рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред


рддреЛ рдпрд╣ Parent1 рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред Parent1 рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рд╡рд╣ рдЦреБрдж рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рддрдм рддрдХ Parent1 рдирд┐рд░реНрдорд╛рдг рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Grandparent рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рд╡рд╣ рдХреИрд╕реЗ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧрд╛? рд╡реЗ рдЪрд░ Parent1 рд╕рд╛рде рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рд╣реИрдВ!


construction table for Parent1-in-Child рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИред рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ Parent1 рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред this Parent1 рдХреЗ рдбреЗрдЯрд╛ рдХреЛ Parent1 ред virtual-base offset рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧреНрд░реИрдВрдбрдкреЗрд░реЗрдВрдЯ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реНрдЯреЗрдк 32 рдмрд╛рдЗрдЯреНрд╕ рдЗрд╕рд╕реЗ рдЖрдЧреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ Grandparent рдореЗрдореЛрд░реА рдорд┐рд▓реЗрдЧреАред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ? рд╡рд░реНрдЪреБрдЕрд▓-рдмреЗрд╕ рдСрдлрд╕реЗрдЯ top_offset рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрдЪреБрдЕрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдПред


рдЕрдм рдЬрдм рд╣рдо рдЗрд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ Parent2 рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ construction table for Parent2-in-Child рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рджрд░рдЕрд╕рд▓, Parent2-in-Child рдореЗрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреА virtual-base offset рд╣реИред


рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдереЛрдбрд╝рд╛ рд╕реЛрдЦрдиреЗ рджреЗрдВред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ? рд╕рдм рдареАрдХ рд╣реИред
рдЕрдм VTT рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ VTT рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


рдкрддрд╛рдореВрд▓реНрдпрдкреНрд░рддреАрдХрд╕рд╛рдордЧреНрд░реА
0x4009a00x400950рдмрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп + 24Vable рдЪрд╛рдЗрд▓реНрдб рдореЗрдВ рдкреЗрд░реЗрдВрдЯ 1 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ
0x4009a80x4009f8рдкреЗрд░реЗрдВрдЯ 1-рдЗрди-рдЪрд╛рдЗрд▓реНрдб + 24 рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрдкреЗрд░реЗрдВрдЯ 1 рдореЗрдердб рдЗрди -1-рдЪрд╛рдЗрд▓реНрдб
0x4009b00x400a18рдкреЗрд░реЗрдВрдЯ 1-рдЗрди-рдЪрд╛рдЗрд▓реНрдб + 56 рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрдкреЗрд░реЗрдВрдЯ-рдЗрди-рдЪрд╛рдЗрд▓реНрдб рдХреЗ рд▓рд┐рдП рджрд╛рджрд╛ рджрд╛рджреА рдХреЗ рддрд░реАрдХреЗ
0x4009b80x400a98рдкреЗрд░реЗрдВрдЯ 2-рдЗрди-рдЪрд╛рдЗрд▓реНрдб + 24 рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрдкреЗрд░реЗрдВрдЯ 2 рдореЗрдердб-рдЗрди-рдЪрд╛рдЗрд▓реНрдб рдХреЗ рддрд░реАрдХреЗ
0x4009c00x400ab8рдкреЗрд░реЗрдВрдЯ 2-рдЗрди-рдЪрд╛рдЗрд▓реНрдб +56 рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рд╡реНрдпрд╡рд╣рд╛рд░реНрдп`рдкреЗрд░реЗрдВрдЯ-рдЗрди-рдЪрд╛рдЗрд▓реНрдб рдХреЗ рд▓рд┐рдП рджрд╛рджрд╛-рджрд╛рджреА рдХреЗ рддрд░реАрдХреЗ
0x4009c80x400998рдЪрд╛рдЗрд▓реНрдб + 96 рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп`рд╡рд┐рд╢рд╛рд▓ рдмрдЪреНрдЪреЗ рдореЗрдВ рджрд╛рджрд╛-рджрд╛рджреА рдХреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ
0x4009d00x400978рдмрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп + 64`рдкреЗрд░реЗрдВрдЯ 2 рдПрдВрдЯреНрд░реАрдЬ рдЗрдирдЯреЗрдмрд▓ рдЪрд╛рдЗрд▓реНрдб

VTT virtual-table table рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИред рдпрд╣ рдПрдХ рдЕрдиреБрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ Parent1 рд╕рд┐рдВрдЧрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, Parent1-in-Child рдпрд╛ Parent1-in-SomeOtherObject ред рдпрд╣ рд╣рдореЗрд╢рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдП рдХрд┐ рдЙрд╕реЗ рдХрд╣рд╛рдВ рдЦреЛрдЬрдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реНрд╡рдпрдВ рдПрдХ рдФрд░ рд╕реВрдЪрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдлреВрд╣ ... рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рдХрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЪреМрдереЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ vtables рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЫреЛрдбрд╝реЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ!


рднрд╛рдЧ 4 - рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ vtables рдФрд░ typeinfo рд╣рдорд╛рд░реЗ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдЙрд╕ рдХрд╛рдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдордЭреЗрдВрдЧреЗ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИред


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕


рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ:


  • рдЕрднрд┐рднрд╛рд╡рдХ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ;
  • рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛, рдпрджрд┐ рдХреЛрдИ рд╣реЛ;
  • рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░реНрд╕ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг;
  • рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрдиред

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЬрдм рддрдХ рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдореВрд▓ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡рддрдГ рдкреНрд░рд╛рд░рдВрдн рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ;
  • рд╕рджрд╕реНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрд░рдВрднрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реВрдЪреА рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ;
  • рдкреВрд░реЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ = рдбрд┐рдлрд╝реЙрд▓реНрдЯ;
  • рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рдЫрд┐рдкрд╛ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:


 #include <iostream> #include <string> using namespace std; class Parent { public: Parent() { Foo(); } virtual ~Parent() = default; virtual void Foo() { cout << "Parent" << endl; } int i = 0; }; class Child : public Parent { public: Child() : j(1) { Foo(); } void Foo() override { cout << "Child" << endl; } int j; }; class Grandchild : public Child { public: Grandchild() { Foo(); s = "hello"; } void Foo() override { cout << "Grandchild" << endl; } string s; }; int main() { Grandchild g; } 

рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрджреНрдо рдХреЛрдб рд▓рд┐рдЦреЗрдВ:


рдорд╛рддрд╛-рдкрд┐рддрд╛рдмрдЪреНрдЪрд╛рдкреЛрддрд╛
1. vtable = рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЬрдирдХ;1. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ;1. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЪрд╛рдЗрд▓реНрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ;
2. рдореИрдВ = 0;2. vtable = рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдЪреНрдЪрд╛;2. рд╡рд┐рдЯреЗрдмрд▓ = рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдкреЛрддреЗ;
3. рдХреЙрд▓ рдлреВ ();3. рдЬреЗ = 1;3., рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ s рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ;
4. рдХреЙрд▓ рдлреВ ();4. рдХреЙрд▓ рдлреВ ();
5. рдПрд╕ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ = рдХреЙрд▓;

рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, vtable рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдХреЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрднрд╛рд╕реА рдХреЙрд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рд╡рд╛рд░рд┐рд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдереЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рд╖реНрдХрд░реНрд╖


 Parent Child Grandchild 

рд╢реБрджреНрдз рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╛рдБ, рддреЛ рдЖрдк рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?), рдЖрдк рд╢рд╛рдпрдж (рдФрд░ рдЙрдореНрдореАрдж рд╣реИ) рд╕реАрдзреЗ segfault рдкрд░ рдЬрд╛рдПрдВрдЧреЗред рдХреБрдЫ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╢рд╛рдВрдд рд╣реИред


рд╡рд┐рдирд╛рд╢рдХрд░реНрддрд╛


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛, рдХреЗрд╡рд▓ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВред


рдпрд╣рд╛рдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдПрдХ рддреНрд╡рд░рд┐рдд рдХрд╡рд╛рдпрдж рд╣реИ: рдХреНрдпреЛрдВ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкреЙрдЗрдВрдЯрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗ? рдЙрддреНрддрд░: рдЬрдм рд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрдм рд╕реЗ рдХреЛрдИ рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╣реА рдирд╖реНрдЯ рд╣реЛ рдЪреБрдХрд╛ рдерд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдЗрдореНрдкреНрд▓рд┐рдореЗрдВрдЯ рдХрд╛рд╕реНрдЯ


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ, рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреЗрд░реЗрдВрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реЛ (рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ)ред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЗ (рдбреЗрд╡рд▓рдкрд░) рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ this рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЕрднрд┐рднрд╛рд╡рдХреЛрдВ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдФрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред


рдбрд╛рдпрдирд╛рдорд┐рдХ рдХрд╛рд╕реНрдЯ (RTTI)


рдбрд╛рдпрдиреЗрдорд┐рдХ рдХрд╛рд╕реНрдЯ typeinfo рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ typeinfo , рдЬрд┐рд╕рдХреА рд╣рдордиреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЬрд╛рдВрдЪ рдХреА рдереАред рд╡реЗ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, typeinfo рд▓рд┐рдП typeinfo рдПрдВрдЯреНрд░реА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ typeinfo рдкреЙрдЗрдВрдЯрд░ рдХрд┐рд╕ рдУрд░ typeinfo рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдХрд╛рд╕реНрдЯ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рд╕реЗ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдпрд╣ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ рдХреА рд▓рд╛рдЧрдд рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред


рд╡рд┐рдзрд┐ рд╕рдВрдХреЗрдд


рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬреЛ рдПрдХ рдЖрднрд╛рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рдПрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд╡рд┐рдкрд░реАрдд)ред


 // TODO:  ,     

рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬрд╛рдВрдЪреЗрдВ!


рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдореНрди рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:


 #include <iostream> using namespace std; class FooInterface { public: virtual ~FooInterface() = default; virtual void Foo() = 0; }; class BarInterface { public: virtual ~BarInterface() = default; virtual void Bar() = 0; }; class Concrete : public FooInterface, public BarInterface { public: void Foo() override { cout << "Foo()" << endl; } void Bar() override { cout << "Bar()" << endl; } }; int main() { Concrete c; c.Foo(); c.Bar(); FooInterface* foo = &c; foo->Foo(); BarInterface* bar = (BarInterface*)(foo); bar->Bar(); //  "Foo()" - WTF? } 

рдпрд╣ рдореЗрд░реЗ рдЪрд╛рд░-рднрд╛рдЧ рдХреЗ рд▓реЗрдЦ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реА рддрд░рд╣ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi480610/


All Articles