এই উদাহরণ বিবেচনা করুন:
#include <iostream>
int main()
{
struct A {};
struct B : A {};
struct C : A, B {};
std::cout << sizeof(A) << '\n'; // 1
std::cout << sizeof(B) << '\n'; // 1
std::cout << sizeof(C) << '\n'; // 2, because of a duplicate base
struct E : A {virtual ~E() {}};
struct F : A, B {virtual ~F() {}};
std::cout << sizeof(E) << '\n'; // 8, the base overlaps the vtable pointer
std::cout << sizeof(F) << '\n'; // 16, but why?
}
এখানে আপনি দেখতে পারেন যে struct Eখালি বেস শ্রেণীর জন্য (যা 1 বাইট বৃহত্তর) প্রত্যাশার মতো vtable পয়েন্টার হিসাবে একই স্টোরেজটি ব্যবহার করে।
তবে struct Fযার ডুপ্লিকেট খালি বেস রয়েছে, এটি ঘটে না। এর কারণ কী?
আমি জিসিসি, কলং এবং এমএসভিসিতে একই ফলাফল পেয়েছি। উপরের ফলাফলগুলি x64 এর জন্য, তাই sizeof(void *) == 8।
মজার বিষয় হচ্ছে, struct G : A, B {void *ptr;};জিসিসি এবং ক্ল্যাংয়ের জন্য ইবিও করেন (আকারটি 8) তবে এমএসভিসি তা করে না (আকার 16)।
Cএবং F? সর্বোপরি, 2 * sizeof(void*) == 16x86_64 তে যেমন আপনি বলেছেন। সংকলক সম্পূর্ণরূপে অনুকূলিত করতে পারে না (স্টোরি টেলার যেমন বলেছিল) এবং তেমনটি করে না।
Aউত্তরাধিকার সূত্রে প্রাপ্ত B, অ্যাক্সেস করা যায় না। ওটা দারুন. আপনার উদাহরণ হিসাবে যেমন আপনি যদি এটি অ্যাক্সেস করার চেষ্টা করেন তবেই আপনি একটি ত্রুটি পান।
C(যার থেকে উত্তরাধিকারীA,B) আপনি কি ফর্মটি inheriting চেয়ে ভিন্ন ফলাফল পেতেAএবংBসরাসরি