【C++ Priemr | 15】虚函数表剖析(三)
生活随笔
收集整理的這篇文章主要介紹了
【C++ Priemr | 15】虚函数表剖析(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、虛擬菱形繼承
#include <iostream> using namespace std;class B { public:int _b; };class C1 :virtual public B { public:int _c1; };class C2 :virtual public B { public:int _c2; };class D :public C1, public C2 { public:int _d; };int main() {cout << sizeof(D); //24return 0; }
二. 虛擬菱形繼承
測試代碼:
#include <iostream> using namespace std; struct A {A(int v = 100) : X(v) {};virtual void foo(void) {}int X; };struct B : virtual public A {B(int v = 10) :Y(v), A(100) {};virtual void fooB(void) {}int Y; };struct C : virtual public A {C(int v = 20) :Z(v), A(100) {}virtual void fooC(void) {}int Z; };struct D : public B, public C {D(int v = 40) :B(10), C(20), A(100), L(v) {}virtual void fooD(void) {}int L; };int main() {A a;int* ptr;ptr = (int*)&a;cout << ptr << " sizeof = " << sizeof(a) << endl;for (int i = 0; i < sizeof(A) / sizeof(int); i++){if (ptr[i] < 10000){cout << dec << ptr[i] << endl;}elsecout << hex << ptr[i] << " = " << hex << *((int*)(ptr[i])) << endl;}cout << "--------------------------------------" << endl;B b;ptr = (int*)& b;cout << "addr:" << ptr << " sizeof = " << sizeof(b) << endl;for (int i = 0; i < sizeof(B) / sizeof(int); i++){if (ptr[i] < 10000){cout << dec << ptr[i] << endl;}elsecout << hex << ptr[i] << " = " << hex << *((int*)(ptr[i])) << endl;}cout << "--------------------------------------" << endl;D d;ptr = (int*)& d;cout << "addr:" << ptr << " sizeof = " << sizeof(d) << endl;for (int i = 0; i < sizeof(D) / sizeof(int); i++){if (ptr[i] < 10000){cout << dec << ptr[i] << endl;}elsecout << hex << ptr[i] << " = " << hex << *((int*)(ptr[i])) << endl;}return 0; }輸出結果:?
參考資料
- ?圖說C++對象模型:對象內存布局詳解
- 從內存布局看C++虛繼承的實現原理
- C++繼承內存對象模型
總結
以上是生活随笔為你收集整理的【C++ Priemr | 15】虚函数表剖析(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青云志2剧情介绍
- 下一篇: 【C++ Priemr | 15】虚函数