空類
空類
#include <iostream>
using namespace std;
class Base
{
void f(){};
};
int main()
{
cout << sizeof(Base) << endl; //1
return 0;
}
虛繼承空類的類大小
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
class Base
{
void f(){};
};
class Derived2 : public virtual Base
{
void d2();
};
int main()
{
cout << sizeof(Derived2) << endl; //8 64位下 有一個指向虛基類的指針
return 0;
}
虛函數
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
class Base
{
virtual void f(){};
};
class Derived1 : public Base
{
void d1();
};
class Derived2 : public Base
{
virtual void d2();
};
int main()
{
cout << sizeof(Base) << endl; //8 64位下 有一個指向虛函數表的指針
cout << sizeof(Derived1) << endl; //8 64位下 有一個指向虛函數表的指針
cout << sizeof(Derived2) << endl; //8 64位下 有一個指向虛函數表的指針
return 0;
}
虛函數 + 虛繼承
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
class Base
{
virtual void f(){};
};
class Derived1 : public Base
{
void f1();
};
class Derived2 : public Base
{
virtual void f2();
};
class Derived3 : public virtual Base
{
virtual void f3();
};
int main()
{
cout << sizeof(Base) << endl; //8 64位下 有一個指向虛函數表的指針
cout << sizeof(Derived1) << endl; //8 64位下 有一個指向虛函數表的指針
cout << sizeof(Derived2) << endl; //8 64位下 有一個指向虛函數表的指針
//每個虛繼承的子類都有一個虛基類指針和虛基類表
//虛繼承 並且有虛函數 跟編譯器有關係
//vs是24(64位) 基類的虛函數表指針 自己的虛函數表指針 指向虛基類的指針
//gcc是8(64位) ???有點疑惑
cout << sizeof(Derived3) << endl;
return 0;
}
成員變量
有成員變量的類
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
class Base
{
public:
int a;
int b;
virtual void f(){};
};
class Derived1 : public Base
{
void f1();
};
class Derived2 : public Base
{
virtual void f2();
};
int main()
{
//4 + 4 + 8
cout << sizeof(Base) << endl;
cout << sizeof(Derived1) << endl;
cout << sizeof(Derived2) << endl;
return 0;
}
靜態成員變量
靜態成員變量不屬於類,計算類大小的時候不用考慮
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
class Base
{
public:
int a;
int b;
static int x;
virtual void f(){};
};
class Derived1 : public Base
{
void f1();
};
class Derived2 : public Base
{
virtual void f2();
};
int main()
{
//4 + 4 + 8
cout << sizeof(Base) << endl;
cout << sizeof(Derived1) << endl;
cout << sizeof(Derived2) << endl;
return 0;
}
多重繼承
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
class Base
{
virtual void f() {};
};
class Derived1
{
virtual void f1() {};
};
class Derived2 : public Base, Derived1
{
virtual void f2() {};
};
int main()
{
cout << sizeof(Base) << endl; //8 64位下 有一個指向虛函數表的指針
cout << sizeof(Derived1) << endl; //8 64位下 有一個指向虛函數表的指針
cout << sizeof(Derived2) << endl; //16 64位下 多個虛函數表指針 ???
return 0;
}