#include <iostream>
using namespace std;
class A
{
};
class B
{
char ch;
virtual void func0() { }
};
class C
{
char ch1;
char ch2;
virtual void func() { }
virtual void func1() { }
};
class D: public A, public C
{
int d;
virtual void func() { }
virtual void func1() { }
};
class E: public B, public C
{
int e;
virtual void func0() { }
virtual void func1() { }
};
int main(void)
{
cout<<"A="<<sizeof(A)<<endl; //result=1
cout<<"B="<<sizeof(B)<<endl; //result=8
cout<<"C="<<sizeof(C)<<endl; //result=8
cout<<"D="<<sizeof(D)<<endl; //result=12
cout<<"E="<<sizeof(E)<<endl; //result=20
getchar();
return 0;
}
结果:
DEV C++:
VC60:
#include <iostream>
using namespace std;
class CommonBase
{
int co;
};
class Base1: virtual public CommonBase
{
public:
virtual void print1() { }
virtual void print2() { }
private:
int b1;
};
class Base2: virtual public CommonBase
{
public:
virtual void dump1() { }
virtual void dump2() { }
private:
int b2;
};
class Derived: public Base1, public Base2//有两个带有虚函数的基类,虚指针所占大小为4*2(是一个vptr还是2个vptr呢????)
{
public:
void print2() { }
void dump2() { }
private:
int d;
};
int main()
{
cout<<sizeof(Base1)<<endl;//12
cout<<sizeof(Base2)<<endl;//12
cout<<sizeof(Derived)<<endl;//24 如果Base1和Base2不是虚继承,则Common Base会补被当做两份不同的拷贝。从而sizeof(Derived)变成28.
getchar();
return 0;
}
结果:
devc++:
VC60:
#include <iostream>
using namespace std;
class A
{
public:
virtual void aa() { }
virtual void aa2() { }
private:
char ch[3];
};
class B: virtual public A
{
public:
virtual void bb() { }
virtual void bb2() { }
};
int main(void)
{
cout<<"A's size is "<<sizeof(A)<<endl;//8
cout<<"B's size is "<<sizeof(B)<<endl;//12
getchar();
return 0;
}
VC60:
参考:
对比补充例子:
#include<iostream>
using namespace std;
class B
{
public:
virtual void fm()
{}
};
class D:public B
{
public:
virtual void fm()
{}
};
int main()
{
cout<<sizeof(B)<<endl;
cout<<sizeof(D)<<endl;
getchar();
}
DevC++下:
VC60下:
#include<iostream>
using namespace std;
class B
{
public:
virtual void fm()
{}
};
class D:public B
{
public:
virtual void ft()
{}
};
int main()
{
cout<<sizeof(B)<<endl;
cout<<sizeof(D)<<endl;
getchar();
}
DEVC++:
VC60:
#include<iostream>
using namespace std;
class B
{
public:
virtual void fm()
{}
};
class D:virtual public B
{
public:
virtual void fm()
{}
};
int main()
{
cout<<sizeof(B)<<endl;
cout<<sizeof(D)<<endl;
getchar();
}
DEVC++:
VC60:
#include<iostream>
using namespace std;
class B
{
public:
virtual void fm()
{}
};
class D:virtual public B
{
public:
virtual void ft()
{}
};
int main()
{
cout<<sizeof(B)<<endl;
cout<<sizeof(D)<<endl;
getchar();
}
DEVC++:
VC60: