рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдЯреЗрдмрд▓ рдХреНрдпрд╛ рд╣реИ?

рдПрдХ рдмрд╛рд░ рд╕реНрд▓реИрдХ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА C ++ рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЖрдпрд╛: "VTTред" рдЧреЙрдбрдмреЛрд▓реНрдЯ :

test.o: In function `MyClass': test.cc:3: undefined reference to `VTT for MyClass' 

рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ "рд╡реАрдЯреАрдЯреА" рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдЯреЗрдмрд▓"ред рдпрд╣ рдПрдХ рдЖрдзрд╛рд░рднреВрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ (рдЗрдЯреЗрдирд┐рдпрдо рд╕реА ++ рдПрдмреАрдЖрдИ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдпрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред VTT рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ (vtable) рдФрд░ рдЯрд╛рдЗрдк рдЗрдВрдлреЙрд░реНрдореЗрд╢рди (typeinfo) рдХреЗ рд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдЖрдк рдмрд╕ "VTT" рдХреЗ рд▓рд┐рдП "vable" рдХреЛ рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдиреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ)ред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реАрдЯреАрдЯреА, рдпрд╛ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЖрдЗрдП рдореВрд▓ рдмрд╛рддреЗрдВ рд╢реБрд░реВ рдХрд░реЗрдВред

рдЧреИрд░-рдЖрднрд╛рд╕реА рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдСрд░реНрдбрд░


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

рдЗрд╕ рддрд░рд╣:

 struct A {}; struct B : A {}; struct C {}; struct D : C {}; struct E : B, D {}; //     // ABCDE 

рд╡рд░реНрдЪреБрдЕрд▓ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдСрд░реНрдбрд░


рд▓реЗрдХрд┐рди рдЖрднрд╛рд╕реА рд╡рд┐рд░рд╛рд╕рдд рд╕рднреА рдХрд╛рд░реНрдбреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддреА рд╣реИ! рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реАрд░реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓ рдЕрднрд┐рднрд╛рд╡рдХ рдПрдХ рд╕рд╛рдЭрд╛ рдкреВрд░реНрд╡рдЬ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 struct G {}; struct M : virtual G {}; struct F : virtual G {}; struct E : M, F {}; //     // GMFE 

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

рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд╕рдмреЛрдмреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдЯреЗрдирд┐рдпрдо рд╕реА ++ рдПрдмреАрдЖрдИ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдлреБрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ред рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╕рднреА рдЧреИрд░-рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд╕рдмреЛрдмрд┐рдЬ (рдФрд░ рдЙрдирдХреЗ рд╕рдмреЛрдмрдЬреЗрдХреНрдЯ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рд╡реАрдПрдлрд╝рдЯреАрдЖрд░ рдХреЛ рдЙрдирдХреЗ рд╡реЙрдпрдЯреЗрдмрд▓ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕реА ++ рдХреЛрдб рдореЗрдВ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рдХреЛрдб рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ)ред рд╕рдВрдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдкреВрд░реНрдг C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реНрдпреБрддреНрдкрдиреНрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рд╕рднреА рд╕рдм -рдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдмрд╛рдХреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЦрдВрдб рдФрд░ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣рдорд╛рд░реЗ ABCDE рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 struct A {}; struct B : virtual A {}; struct C {}; struct D : virtual C {}; struct E : B, D {}; //     // ACBDE 

рдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ E рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдкрд╣рд▓реЗ рд╡рд░реНрдЪреБрдЕрд▓ рд╕рдмрдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ A рдФрд░ C рдХреЗ рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ; рддрдм рдЖрдзрд╛рд░ рдЧреИрд░-рдЖрднрд╛рд╕реА рд╡рд┐рд░рд╛рд╕рдд рд╡рд╕реНрддреБ B рдФрд░ D рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╣рд▓рд╛рддреЗ рд╣реИрдВред B рдФрд░ D рдХреНрд░рдорд╢рдГ A рдФрд░ C рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред

рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЯреЗрдмрд▓


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ ( рдЧреЙрдбрдмреЛрд▓реЗрдЯ )

 struct Cat { Cat() { poke(); } virtual void poke() { puts("meow"); } }; struct Lion : Cat { std::string roar = "roar"; Lion() { poke(); } void poke() override { roar += '!'; puts(roar.c_str()); } }; 

рдЬрдм рд╣рдо рд▓рд╛рдпрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмреЗрд╕рд┐рдХ рдХреИрдЯ рд╕рдм -рдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХреИрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдкреНрд░рд╣рд╛рд░ () рдХрд╣рддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреИрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ - рд╣рдордиреЗ рдЕрднреА рддрдХ рд╕рджрд╕реНрдп рдбреЗрдЯрд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд▓рд╛рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рдХреИрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рд╛рдпрди :: рдкреЛрдХ () рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ std :: string roar рдХреЗ рдЕрдирд░рд┐рдЯрд▓рд╛рдЗрдЬреНрдб рдореЗрдВрдмрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ UB рдорд┐рд▓рддрд╛ рд╣реИред рддреЛ, C ++ рдорд╛рдирдХ рд╣рдореЗрдВ рдмрд┐рд▓реНрд▓реА рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИ, рдкреЛрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ () рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреИрдЯ :: рдкреЛрдХ (), рди рдХрд┐ рд╢реЗрд░ :: рдкреЛрдХ () рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗрд╡рд▓ рдХреИрдЯ :: рдХреИрдЯ () (рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рджреЛрдиреЛрдВ) рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреИрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд╛рдЗрдмрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред рд╢реЗрд░ :: рд╢реЗрд░ () рдмрд┐рд▓реНрд▓реА рдХреЛ рдмреБрд▓рд╛рдПрдЧрд╛: рдмрд┐рд▓реНрд▓реА (), рдФрд░ рдлрд┐рд░ рдХреЛрд╖реНрдардХ рдореЗрдВ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реЗрд░ рдХреЗ рдЕрдВрджрд░ рдмрд┐рд▓реНрд▓реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП vptr рд░реАрд╕реЗрдЯ рдХрд░реЗрдВред рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ!

рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдСрдлрд╝рд╕реЗрдЯреНрд╕


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

 struct Animal { const char *data = "hi"; }; struct Cat : virtual Animal { Cat() { puts(data); } }; struct Nermal : Cat {}; struct Garfield : Cat { int padding; }; 

рдмрд┐рд▓реНрд▓реА рдирд┐рд░реНрдорд╛рддрд╛ рд╕рджрд╕реНрдп :: рдкрд╢реБ рдбреЗрдЯрд╛ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдХреИрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд░реНрдорд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдзрд╛рд░ рд╕рдмрдмреЙрдЬреЗрдХреНрдЯ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд╕рджрд╕реНрдп рдбреЗрдЯрд╛ vptr рдХреЗ рдареАрдХ рдкреАрдЫреЗ рдСрдлрд╕реЗрдЯ 8 рдкрд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреИрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧрд╛рд░рдлреАрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдк-рдЦрдВрдб рд╣реИ, рддреЛ рд╕рджрд╕реНрдп рдбреЗрдЯрд╛ vptr рдФрд░ рдЧрд╛рд░рдлреАрд▓реНрдб :: рдкреИрдбрд┐рдВрдЧ рдХреЗ рдкреАрдЫреЗ, рдСрдлрд╕реЗрдЯ 16 рдкрд░ рд╣реИред рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдЯреЗрдирд┐рдпрдо рдПрдмреАрдЖрдИ рдмрд┐рд▓реНрд▓реА рд╡рд╕реНрддреБ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрднрд╛рд╕реА рдЖрдзрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдСрдлрд╕реЗрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдХреИрдЯ-рдЗрди-рдирд┐рд░реНрдорд▓ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЗрдмреЗрдЯ рдЗрд╕ рддрдереНрдп рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╢реБ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреИрдЯ рд╕рдмрдмреЙрдЬреЗрдХреНрдЯ, рдСрдлрд╕реЗрдЯ 8 рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ; рдХреИрдЯ-рдЗрди-рдЧрд╛рд░рдлреАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЗрд╕ рддрдереНрдп рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдкрд╢реБ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреИрдЯ рд╕рдмрдмрдЬреЗрдХреНрдЯ, рдХреЛ рдСрдлрд╕реЗрдЯ 16 рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рдорд┐рд▓рд╛рдПрдБред рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреИрдЯ :: рдХреИрдЯ () (рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рджреЛрдиреЛрдВ) рдХреИрдЯ-рдЗрди-рдирд┐рд░реНрдорд▓ рдХреЗ рд▓рд┐рдП рд╡реАрдЖрдИрдмреАрдЯреАрдЖрд░ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдХреИрдЯ-рдЗрди-рдЧрд╛рд░рдлреАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдкрд░ рдЯрд╛рдЗрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ рд╕рдмрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕реБрд╡рд┐рдзрд╛! рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкреВрд░реНрд╡-рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╣ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЙрдкрдкрдЯреНрдЯ рдХрд╛ vptr рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдмрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЖрдзрд╛рд░ рдЙрдк-рдЖрдзрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреА рд╣реЛрдЧреАред рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ! рдЖрдЗрдП рдХреИрдЯ: рдХреИрдЯ () ( рдЧреЙрдбрдмреЙрд▓реНрдЯ ) рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

 _ZN3CatC1Ev: #    Cat movq $_ZTV3Cat+24, (%rdi) # this->vptr = &vtable-for-Cat; retq _ZN3CatC2Ev: #     Cat movq (%rsi), %rax # fetch a value from rsi movq %rax, (%rdi) # this->vptr = *rsi; retq 

рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛% rdi рдореЗрдВ рди рдХреЗрд╡рд▓ рдЗрд╕ рдЫрд┐рдкреЗ рд╣реБрдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐% rsi рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП VTT рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ! рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (% rsi) рд╕реЗ рдкрддреЗ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреИрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдореЗрдВ рдкрддреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

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

рд╣рдореЗрдВ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рдкреВрд░реНрдг рдирд░реНрдорд▓ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 _ZN3CatC2Ev: #    Cat movq (%rsi), %rax #    rsi movq %rax, (%rdi) # this->vptr = *rsi; retq _ZN6NermalC1Ev: #    Nermal pushq %rbx movq %rdi, %rbx movl $_ZTT6Nermal+8, %esi # %rsi = &VTT-for-Nermal callq _ZN3CatC2Ev #     Cat movq $_ZTV6Nermal+24, (%rbx) # this->vptr = &vtable-for-Nermal popq %rbx retq _ZTT6Nermal: .quad _ZTV6Nermal+24 # vtable-for-Nermal .quad _ZTC6Nermal0_3Cat+24 # construction-vtable-for-Cat-in-Nermal 

рдХреНрдпреЛрдВ _ZTC6Nermal0_3Cat + 24 рдбреЗрдЯрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкрддрд╛% rsi рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрдЬрд╛рдп рд╕реАрдзреЗ _ZTC6Nermal0_3Cat + 24 рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рд╕реАрдзреЗ?

 #   ? _ZN3CatC2Ev: #     Cat movq %rsi, (%rdi) # this->vptr = rsi; retq _ZN6NermalC1Ev: #     Nermal pushq %rbx movq %rdi, %rbx movl $_ZTC6Nermal0_3Cat+24, %esi # %rsi = &construction-vtable-for-Cat-in-Nermal callq _ZN3CatC2Ev #     Cat movq $_ZTV6Nermal+24, (%rbx) # this->vptr = &vtable-for-Nermal popq %rbx retq 

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдХрдИ рд╕реНрддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ! рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░, рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд╡реАрдкреАрдЯреАрдЖрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░, рд╕рдВрднрд╡рддрдГ, рдЕрдЧрд▓реЗ рдмреЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ, рдЬреЛ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реАрдкреАрдЯреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реВрдЪреА рдпрд╛ рд╕рдВрдХреЗрдд рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг ( рдЧреЙрдбрдмреЛрд▓реНрдЯ ) рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 struct VB { int member_of_vb = 42; }; struct Grandparent : virtual VB { Grandparent() {} }; struct Parent : Grandparent { Parent() {} }; struct Gretel : Parent { Gretel() : VB{1000} {} }; struct Hansel : Parent { int padding; Hansel() : VB{2000} {} }; 

рдж рдЧреНрд░реИрдВрдбрдкреЗрд░реЗрдВрдЯ рдмреЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЧреНрд░реИрдВрдбрдкрд░реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡реАрдЯреАрдЖрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдХреБрдЫ рдФрд░, рдЬреЛ рд╕рдмрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рд╣реИред рдкреЗрд░реЗрдВрдЯ рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╣рд▓реЗ Grandparent :: Grandparent () рдХреЛ рдЙрдкрдпреБрдХреНрдд% rsi рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдкреЗрд░реЗрдВрдЯ рдХреЛ vptr рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдХреБрдЫ рдФрд░, рдЬреЛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рд╣реИред Gretel рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛:

 Gretel::Gretel() [  ]: pushq %rbx movq %rdi, %rbx movl $1000, 8(%rdi) # imm = 0x3E8 movl $VTT for Gretel+8, %esi callq Parent::Parent() [  ] movq $vtable for Gretel+24, (%rbx) popq %rbx retq VTT for Gretel: .quad vtable for Gretel+24 .quad construction vtable for Parent-in-Gretel+24 .quad construction vtable for Grandparent-in-Gretel+24 

рдЖрдк Godbolt рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд╣рд▓реЗ Grandparent :: Grandparent () рдХреЛ% rsi + 8 рдХрд╣рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрдкрдирд╛ vptr to (% rsi) рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░реЗрдЯреЗрд▓, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдзреНрдпрд╛рди рд╕реЗ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХрд╛ рдПрдХ рд░рд╛рд╕реНрддрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдЙрд╕рдХреЗ рд╕рднреА рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЙрд╕реА VTT рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдзреНрд╡рдВрд╕рдХ ( рдЧреЙрдбрдмреЛрд▓реНрдЯ ) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, VTT рдЯреЗрдмрд▓ рдХреА рдЕрд╢рдХреНрдд рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Gretel рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ Vretr рдореЗрдВ Gretel + 24 рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрддрд╛ рд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕реЗ рдХрднреА рднреА VTT рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрдЬ рдХреА рд╢реВрдиреНрдп рдкрдВрдХреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред (рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рджреВрд░ рдирд╣реАрдВ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдЯреЗрдирд┐рдпрдо рдПрдмреАрдЖрдИ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛ рдФрд░ рдЗрдЯреЗрдирд┐рдпрдо-рдПрдмреАрдЖрдИ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд░рд╛рдиреЗ рдХреЛрдб рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛)ред

рдпрд╣ рд╕рдм рд╣реИ, рд╣рдо рдЖрднрд╛рд╕реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ, рдпрд╛ VTT рдХреА рдПрдХ рдореЗрдЬ рдкрд░ рджреЗрдЦрд╛ред

рдЖрдЧреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА


рдЖрдк рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ VTT рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

StackOverflow: тАЬ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП VTT рдХреНрдпрд╛ рд╣реИ? "
" рдЬреАрд╕реАрд╕реА рд╕реА ++ рдХрдВрдкрд╛рдЗрд▓рд░ v4.0.1 рдореЗрдВ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдкрд░ VTable рдиреЛрдЯреНрд╕ " (рдореЙрд░реНрдЧрди рдбрд┐рдЯреЗрдХреНрдЯрд░, 2005)
рдЗрдЯреЗрдирд┐рдпрдо рд╕реА ++ рдПрдмреАрдЖрдИ , "рд╡реАрдЯреАрдЯреА рдСрд░реНрдбрд░" рдЕрдиреБрднрд╛рдЧ

рдЕрдВрдд рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рджреЛрд╣рд░рд╛рдирд╛ рд╣реИ рдХрд┐ VTT Itanium C ++ ABI рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдирдХреНрд╕, OSX, рдЖрджрд┐ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Windows рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ MSVC ABI рдореЗрдВ VTT рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВ (рдЕрднреА рддрдХ) MSVC ABI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рджрд┐рди рдореБрдЭреЗ рд╕рдм рдХреБрдЫ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреВрдВрдЧрд╛!

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


All Articles